如何使用文件将数据从 mysql 迁移到 clickhouse?
Posted
技术标签:
【中文标题】如何使用文件将数据从 mysql 迁移到 clickhouse?【英文标题】:How to use a file to migrate data from mysql to a clickhouse? 【发布时间】:2018-09-15 13:28:25 【问题描述】:我需要将数据从 mysql 迁移到 ClickHouse 并做一些测试。这两个数据库网络都不行,我只好用文件来传输。我首先想到的是可以使用mysqldump工具导出.sql文件。
mysqldump -t -h192.168.212.128 -P3306 --default-character-set=utf8 -uroot -proot database_name table_name > test.sql
然后我发现mysql表中有1.2亿条数据。这种方式导出的.sql文件的insert语句很长。如何避免这种情况,比如每次导出1000条数据作为insert语句?
另外,这个.sql文件太大了,能不能分成小文件,需要做什么?
【问题讨论】:
【参考方案1】:mysqldump 有一个使用多值插入打开或关闭的选项。您可以根据自己的喜好执行以下任一操作:
每个值单独插入语句:
mysqldump -t -h192.168.212.128 -P3306 --default-character-set=utf8 --skip-extended-insert -uroot -proot database_name table_name > test.sql
多值插入语句:
mysqldump -t -h192.168.212.128 -P3306 --default-character-set=utf8 --extended-insert -uroot -proot database_name table_name > test.sql
所以你可以做的是首先使用以下内容转储架构:
mysqldump -t -h192.168.212.128 -P3306 --default-character-set=utf8 --no-data -uroot -proot database_name > dbschema.sql
然后将数据单独转储为单独的插入语句:
mysqldump -t -h192.168.212.128 -P3306 --default-character-set=utf8 --skip-extended-insert --no-create-info -uroot -proot database_name table_name > test.sql
然后,您可以将 INSERT 文件拆分为尽可能多的部分。例如,如果您使用的是 UNIX,请使用 split 命令。
如果您担心导入需要多长时间,您可能还需要添加 --disable-keys 选项以加快插入速度。
但我的建议是不要太担心这一点。 mysqldump 不应超过 MySQL 在单个语句中导入的能力,它应该比单个插入运行得更快。至于文件大小,SQL 的一个优点是它可以很好地压缩。那个数 GB 的 SQL 转储将变成一个非常紧凑的 gzip 或 bzip 或 zip 文件。
编辑:如果您真的想在多值插入转储中调整每个插入的值的数量,您可以添加 --max_allowed_packet 选项。例如。 --max_allowed_packet=24M 。数据包大小决定了单个数据包(例如插入)的大小,因此如果将其设置得足够低,它应该会减少每次插入的值的数量。不过,在你开始搞砸之前,我会按原样尝试。
【讨论】:
【参考方案2】:clickhouse-client --host="localhost" --port="9000" --max_threads="1" --query="INSERT INTO database_name.table_name FORMAT Native"
【讨论】:
以上是关于如何使用文件将数据从 mysql 迁移到 clickhouse?的主要内容,如果未能解决你的问题,请参考以下文章
使用 pymongo 将数据从 Mysql 迁移到 MongoDB
怎么将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL