mysqldump
mysqldump是导出数据、备份数据的工具。可以用docker环境,也可以直接安装相关的客户端。对于不同的数据库之间相互导数据,貌似,导入csv速度比较快。
但是mysql是否能导出csv,甚至想导入部分字段,好像mysqldump很实现。(间接实现,比如mysql 中执行select into 、或者执行建表、则insert into newtable select 等等。)
但是,其实发现,单纯用php的pdo + fputcsv方式,也可以很快。
安装方式:
yum install mysql-client
docker run --rm -it -v $PWD:/mywork -w /mywork mysql:5.7.23 bash
资源
https://www.cnblogs.com/kgdxpr/p/5126291.html ( 可以拷贝内容)
https://www.cnblogs.com/microcat/p/6825903.html
https://www.cnblogs.com/wuhongkuan/p/4704299.html
正文
首先,mysqldump是作为备份数据库的工具。备份的速度,还是非常快的。250万条记录,测试过10秒左右,能到出sql。
参数
使用示例
-d仅导出表结构,不导数据。-t 不导出create table建表语句
--skip-lock-tables到出表的过程中,可能要锁表,如果所使用的账号权限不够,则可以不锁表。-w 参数 或者 –where
-w "res_type=1 and group_id=1" --where="res_type=1 and group_id=1 and ts>2015122115005600474 ORDER BY TS DESC LIMIT 1"-P指定端口-h 10.131.41.13 指定ip
3种方式
# 导出具体的某张表、或者库
mysqldump [OPTIONS] database [tables]
# 导出多个库
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
# 导出所有
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
导表结构
# 整个数据库
mysqldump -h 10.131.41.13 -P 3401 -u $DBUSER -p$PASSWD --databases tmm -d --skip-lock-tables > tmm.sql
# 直接导出具体某张表
mysqldump -h 10.131.41.13 -P 3401 -u $DBUSER -p$PASSWD -d --skip-lock-tables tmm tmm_busi_intercept > tmm_busi_intercept_table.sql
导表
下面的表,大概有250万左右,导出10秒左右,感觉比select count还快。
mysqldump -h 10.0.45.1 -P 3306 -u $DBUSER -p$PASSWD --skip-lock-tables ydjcwh_log gs_modify_log > gs_modify_log.sql
导出部分字段
思路:
创建一个view,然后直接导view视图?没有尝试过。
创建新的表。
insert into new-table (a,b,c) select a,b,c from old-table;
批量导出到csv的解决方式
$db = [
'dsn'=>'mysql:host=;port=3401;dbname=tmm;charset=utf8',
'user'=>'',
'pass'=>'',
];
function export_data($sql,$file){
global $db;
$fd = \fopen($file,'w');
$pdo = new \PDO($db['dsn'], $db['user'], $db['pass'], array(
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
));
$stat = $pdo->query($sql);
while($row = $stat->fetch(\PDO::FETCH_COLUMN)){
fputcsv($fd,$row);
}
$pdo = null;
fclose($fd);
}
export_data("select ship_id,req_inte_time from tmm_busi_intercept where req_inte_time >='2021-07-01 00:00:00' and req_inte_time < '2021-07-02 00:00:00';",'tmm_busi_intercept.csv');
如果表比较大,则应该分批导入,用到的条件要用上索引。一般是主键、或者时间。
直接使用Mysqldump导出表结构
mysqldump -h 10.131.38.14 -P 3407 -u $DBUSER -p$PASSWD -t -T /home/yyy.csv ydserver yyy --fields-terminated-by=',' --skip-lock-tables;
但是需要权限:
mysqldump: Got error: 1045: "Access denied for user 'other'@'%' (using password: YES)" when executing 'SELECT INTO OUTFILE'
按这个种理解,又导到服务器上了?
select导csv
跟mysqldump类似,具体
SELECT * FROM mytable
INTO OUTFILE '/tmp/mytable.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
参考:https://www.jb51.net/article/73735.htm
导出表结构
export WHERE_DUMP="insert_db_date >= '2021-7-1' and insert_db_date < '2021-7-2'"
#-- w的参数 "$WHERE_DUMP" 参数不能省略
mysqldump -h 101.182.54.18 -P 3403 -u $DBUSER -p$PASSWD -w "$WHERE_DUMP" --skip-lock-tables db table > marked_ship_0.sql
批量导入
#!/bin/bash
#mysql -h 10.181.54.18 -P 3401 -u $DBUSER -p$PASSWD -D ordercenter_order_tag_0
WHERE_DUMP="insert_db_date >= '2021-7-1' and insert_db_date < '2021-7-11'"
echo $WHERE_DUMP;
for db in `seq 0 2`;do
for table in `seq 0 15`;do
outsql=marked_ship_"$db"_"$table".sql
echo "ordercenter_order_tag_"$db marked_ship_$table to $outsql
mysqldump -h 10.181.54.18 -P 3401 -u $DBUSER -p$PASSWD -w "$WHERE_DUMP" --skip-lock-tables -t ordercenter_order_tag_$db marked_ship_$table > $outsql
sed -i "1,/LOCK TABLES/d;s/\`marked_ship_$table\`/marked_ship/g;/UNLOCK TABLES/d" $outsql
echo "psql -f $outsql" > gp_load_marked_ship.sh
done
done