mysql - 将 10GB 的 mysql 表发送到远程服务器
问题描述
我正在尝试将大型 myisam 表(10GB)导出到远程服务器:
zcat mytable.sql.gz | mysql --host=xx --user=xx --port=xx --password=xx dw
由于远程服务器配置(我无法更改)和 RAM,发送 gzip mysqldump 系统性地失败。
我试图用每行一个插入来构建一个转储:
mysqldump db_name --extended-insert=FALSE --no-create-info=TRUE | gzip > mytable.sql.gz
并将其拆分为 200M 块:
split -C 200M --numeric-suffixes mytable.sql.gz /dumps/mytable_part
但是发送这些 200M 块中的一个需要 20 多分钟,因此发送整个表对于定期备份来说太慢了。我猜每行插入一个非常慢。
一种解决方案可能是进行多个插入转储,但使用分组插入,如 INSERT INTO (field) VALUES (1), (2), ... 但我不确定这是否可能。
有没有我没有想到的解决方法?
解决方案
mysqldump \
--extended-insert=FALSE \
--no-create-info=TRUE \
db_name \
| ssh \
username@remote-host.example.com \
mysql \
--user=xx \
--password=xx \
dw
这个怎么运作:
mysqldump --extended-insert=FALSE --no-create-info=TRUE db_name
创建 的 MySQL 转储db_name
并将数据流式传输到stdio
输出中。
| ssh username@remote-host.example.com
stdio
将流通过
管道传输到ssh
与远程主机的连接中
mysql --user=xx --password=xx dw
是连接mysql
在远程主机上执行的命令ssh
。它读取stdio
通过ssh
连接传输并来自 MySQL 转储的流。该转储在本地生成,通过远程主机传输ssh
并导入到 dw 数据库中。
这种方法比任何有能力的管理员都拒绝将 MySQL 协议开放到广泛的 Internet 更安全和紧凑。
这可能就是您第一次尝试使用mysql
直接寻址远程主机的命令不起作用的原因。远程主机 MySQL 数据库服务器未侦听或接受远程连接,或者至少不是来自广泛的 Internet。
使用ssh
以下命令可以安全地传输转储数据,同时让远程主机的 MySQL 服务器仅处理来自mysql
命令的本地连接。
推荐阅读
- powershell - 尝试从批处理文件运行 PowerShell 脚本失败
- python - AssertionError:通过了 5 列,传递的数据有 1 列
- spring-boot - spring-data-jdbc:查询实体,包含与 JOOQ 的 1-n 关系
- google-bigquery - BIGQUERY 表中的整数列分区功能何时可用?
- php - Laravel,使用分页方法 Illuminate\Database\Eloquent\Collection::render 不存在
- dom - 在 DOM 突变事件上启动 FocusManager.parse_for_input
- vb.net - 如何在 WebApi 中路由两个具有相同参数的 get 方法?
- python - 从现有字典创建频率字典
- javascript - 用获取的数据反应上下文
- excel - 调用 VBA 函数时在 Excel 中返回 #VALUE