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