背景
数据库实际应用场景中常常需要进行数据导入导出,本文将介绍在PolarDB-X中数据导入导出的最佳实践。
测试环境
本文档的测试环境见下表:
环境 | 参数 |
---|---|
PolarDB-X版本 | polarx-kernel_5.4.11-16282307_xcluster-20210805 |
节点规格 | 16核64GB |
节点个数 | 4个 |
网络带宽 | 10 Gbps |
测试的表用例:
CREATE TABLE `sbtest1` ( `id` int(11) NOT NULL, `k` int(11) NOT NULL DEFAULT '0', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `k_1` (`k`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`);
复制
导入导出工具介绍
PolarDB-X常见的数据导出方法有:
- mysql -e命令行导出数据
- musqldump工具导出数据
- select into outfile语句导出数据(默认关闭)
- Batch Tool工具导出数据 (PolarDB-X配套的导入导出工具)
PolarDB-X常见的数据导入方法有:
- source语句导入数据
- mysql命令导入数据
- 程序导入数据
- load data语句导入数据
- Batch Tool工具导入数据 (PolarDB-X配套的导入导出工具)
MySQL原生命令使用例子
mysql -e命令可以连接本地或远程服务器,通过执行sql语句,例如select方式获取数据,原始输出数据以制表符方式分隔,可通过字符串处理改成','
分隔,以csv文件方式存储,方法举例:
mysql -h ip -P port -u usr -pPassword db_name -N -e "SELECT id,k,c,pad FROM sbtest1;" >/home/data_1000w.txt ## 原始数据以制表符分隔,数据格式:188092293 27267211 59775766593-64673028018-...-09474402685 01705051424-...-54211554755 mysql -h ip -P port -u usr -pPassword db_name -N -e "SELECT id,k,c,pad FROM sbtest1;" | sed 's/\t/,/g' >/home/data_1000w.csv ## csv文件以逗号分隔,数据格式:188092293,27267211,59775766593-64673028018-...-09474402685,01705051424-...-54211554755
复制
原始数据格式适合load data语句导入数据,使用方法可参考:LOAD DATA 语句,使用举例:
LOAD DATA LOCAL INFILE '/home/data_1000w.txt' INTO TABLE sbtest1; ## LOCAL 代表从本地文件导入 local_infile参数必须开启
复制
csv文件数据适合程序导入,具体方式可查看:使用程序进行大数据导入。
mysqldump工具使用例子
mysqldump工具可以连接到本地或远程服务器,详细使用方法可参考:使用mysqldump导入导出数据。 导出数据举例:
mysqldump -h ip -P port -u usr -pPassword --default-character-set=utf8mb4 --net_buffer_length=10240 --no-tablespaces --no-create-db --no-create-info --skip-add-locks --skip-lock-tables --skip-tz-utc --set-charset --hex-blob db_name [table_name] > /home/dump_1000w.sql ## mysqldump导出数据可能会出现的问题: 【问题1】: mysqldump: Couldn't execute 'SHOW VARIABLES LIKE 'gtid\_mode'' 【解决】:添加 --set-gtid-purged=OFF 参数关闭gtid_mode。 【问题2】:mysqldump: Couldn't execute 'SHOW VARIABLES LIKE 'ndbinfo\_version'' 【解决】:查看mysqldump --version和mysql版本是否一致,使用和mysql版本一致的mysql client。 这两个问题通常是mysql client和mysql server版本不一致导致的。
复制
导出的数据格式是SQL语句方式,以Batch Insert语句为主体,包含多条SQL语句,INSERT INTO
sbtest1VALUES (...),(...)
,net_buffer_length参数将影响batch size大小。 SQL语句格式合适的导入数据方式:
方法一:souce语句导入数据 source /home/dump_1000w.sql 方法二:mysql命令导入数据 mysql -h ip -P port -u usr -pPassword --default-character-set=utf8mb4 db_name < /home/dump_1000w.sql
复制
Batch Tool工具使用例子
Batch Tool工具是阿里云内部开发的数据导入导出工具,支持多线程操作,使用方法可参考:使用Batch Tool工具导入导出数据。 导出数据:
## 导出 默认值=分片数 个文件 java -jar batch-tool.jar -h ip -P port -u usr -pPassword -D db_name -o export -t sbtest1 -s , ## 导出整合成一个文件 java -jar batch-tool.jar -h ip -P port -u usr -pPassword -D db_name -o export -t sbtest1 -s , -F 1
复制
导入数据:
## 导入32个文件 java -jar batch-tool.jar -hpxc-spryb387va1ypn.polarx.singapore.rds.aliyuncs.com -P3306 -uroot -pPassw0rd -D sysbench_db -o import -t sbtest1 -s , -f "sbtest1_0;sbtest1_1;sbtest1_2;sbtest1_3;sbtest1_4;sbtest1_5;sbtest1_6;sbtest1_7;sbtest1_8;sbtest1_9;sbtest1_10;sbtest1_11;sbtest1_12;sbtest1_13;sbtest1_14;sbtest1_15;sbtest1_16;sbtest1_17;sbtest1_18;sbtest1_19;sbtest1_20;sbtest1_21;sbtest1_22;sbtest1_23;sbtest1_24;sbtest1_25;sbtest1_26;sbtest1_27;sbtest1_28;sbtest1_29;sbtest1_30;sbtest1_31" -np -pro 64 -con 32 ## 导入一个文件 java -jar batch-tool.jar -h ip -P port -u usr -p password -D db_name -o import -t sbtest1 -s , -f "sbtest1_0" -np
复制
导出方法对比
测试方法以PolarDB-X导出1000w行数据为例,数据量大概2GB左右。
方式 | mysql -e命令导出原始数据 | mysql -e命令 导出csv格式 | mysqldump工具(net-buffer-length=10KB) | mysqldump工具(net-buffer-length=200KB) | Batch Tool工具 文件数=32(分片数) | Batch Tool工具 文件数=1 |
---|---|---|---|---|---|---|
数据格式 | 原始数据格式 | csv格式 | sql语句格式 | sql语句格式 | csv格式 | csv格式 |
文件大小 | 1998MB | 1998MB | 2064MB | 2059MB | 1998MB | 1998MB |
耗时 | 33.417s | 34.126s | 30.223s | 32.783s | 4.715s | 5.568s |
性能(行每秒) | 299248 | 293031 | 330873 | 305036 | 2120890 | 1795977 |
性能(MB/S) | 59.8 | 58.5 | 68.3 | 62.8 | 423.7 | 358.8 |
总结:
- mysql -e命令和mysqldump工具原理上主要是单线程操作,性能差别并不明显
- Batch Tool工具采用多线程方式导出,并发度可设置,能够极大提高导出性能
导入方法对比
测试方法以PolarDB-X导入1000w行数据为例,源数据是上一个测试中导出的数据,数据量大概2GB左右。
方式 | source语句(net-buffer-length=10KB) | source语句(net-buffer-length=200KB) | mysql命令导入(net-buffer-length=10KB) | mysql命令导入(net-buffer-length=200KB) | load data语句导入 | 程序导入 batch-1000 thread-1 | 程序导入 batch-1000 thread-32 | Batch Tool工具 文件数=32(分片数) | Batch Tool工具 文件数=1 |
---|---|---|---|---|---|---|---|---|---|
数据格式 | sql语句格式 | sql语句格式 | sql语句格式 | sql语句格式 | 原始数据格式 | csv格式 | csv格式 | csv格式 | csv格式 |
耗时 | 10m24s | 5m37s | 10m27s | 5m38s | 4m0s | 5m40s | 19s | 19.836s | 10.806s |
性能(行每秒) | 16025 | 29673 | 15948 | 29585 | 41666 | 29411 | 526315 | 504133 | 925411 |
性能(MB/S) | 3.2 | 5.9 | 3.2 | 5.9 | 8.3 | 5.9 | 105.3 | 100.8 | 185.1 |
总结:
- source语句和mysql命令导入方式,都是单线程执行SQL语句导入,实际是Batch Insert语句的运用,Batch size大小会影响导入性能。Batch size和mysqldump导出数据时的net-buffer-length参数有关。优化点:
- 推荐将net-buffer-length参数设大,不超过256K,以增大batch size大小,来提高插入性能;
- 使用第三方类似mysqldump的工具,例如mydumper(备份)和myloader(导入)等,可多线程操作。
- load data语句是单线程操作,性能比mysql命令和source语句好一些。
- 程序导入具有较好的灵活性,可自行设置合适的batch size和并发度,可以达到较好性能。推荐batch大小为1000,并发度为16~32。
- Batch Tool工具支持多线程导入,且贴合分布式多分片的操作方式,性能较好。
总结
- PolarDB-X兼容MySQL运维上常用的数据导入导出方法,但这些方法大多为MySQL单机模式设计,只支持单线程操作,性能上无法充分利用所有分布式资源。
- PolarDB-X提供Batch Tool工具,非常贴合分布式场景,在多线程操作下,能够达到极快的数据导入导出性能。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
国内独家|阿里云首发MongoDB 8.0,性能提升“快”人一步
阿里云瑶池数据库
215次阅读
2025-04-24 09:53:13
SQL 优化之 OR 子句改写
xiongcc
136次阅读
2025-04-21 00:08:06
揭秘PostgreSQL SELECT查询中的意外“写”行为
PolarDB
53次阅读
2025-04-15 09:56:40
秒级修改字段
胖橘
46次阅读
2025-04-23 11:33:45
PolarDB MySQL之列存索引(IMCI)性能
xiaozhuo
43次阅读
2025-04-21 16:11:53
PostgreSQL 虚拟文件描述符
PolarDB
42次阅读
2025-04-25 10:10:46
PolarDB MySQL之列存索引测试方法
xiaozhuo
42次阅读
2025-04-21 16:06:42
PolarDB MySQL之在只读节点上创建自定义临时表
xiaozhuo
42次阅读
2025-04-21 15:49:05
4年10亿美金,Neon用Serverless PG证明:AI需要的不是“大”,而是“隐形”
阿里云瑶池数据库
38次阅读
2025-05-08 10:03:12
浅析systemd管理postgres
PolarDB
38次阅读
2025-04-28 11:01:19