MySQLDump 的 shell 管道行为

MySQLDump 的 shell 管道行为

我正在使用 mysqldump 处理大型数据库(几 GB)并从管道导入结果,请参阅下面的命令,它是执行增量管道,还是等到第一个管道完成后再导入?这是跨服务器导入大型数据库的好方法吗?我知道您可以将其导出为 gz,然后将其 pscp 然后导入。欢迎使用快速替代方案

mysqldump -u root -ppass -q mydatabase | mysql -u root -ppass --host=xxx.xx.xxx.xx --port=3306 -C mydatabase

答案1

它“逐步”地执行此操作*。具体来说,第二个进程一看到 mysql 语句就会执行它,而第一个进程每次遇到换行符时都会发送一个 mysql 语句\n

* 取决于您如何定义增量。

答案2

mysqldump输出 SQL 命令,删除表(如果存在)、创建表,然后逐行填充表。每条语句在读取后立即执行;这包括在每个语句之后适当更新索引并执行您设置的任何日志记录。它非常强大且可移植,因此非常适合备份,但它是你能想到的最低效的传输机制。

如果你正在应对全部的数据库集,您可以通过简单地复制数据库文件(通常在 中找到)来简化此过程/var/lib/mysql。更流行的存储引擎的二进制格式可跨架构移植,从而使文件复制相对可靠。但是,请确保采取措施防止数据在复制时发生变化,方法是锁定表或简单地关闭 MySQL,直到复制(或存档)过程完成。

请注意,MyISAM 将其所有文件存储在架构的子目录中,因此/var/lib/mysql/mydb/将包含架构(“数据库”)所需的一切mydb。只需将该子目录复制到另一台服务器即可。但是,默认情况下,InnoDB 表将其数据存储在和中,/var/lib/mysql/ibdata*/var/lib/mysql/ib_logfile*在服务器上的所有其他各种 InnoDB 表之间共享这些文件。因此,如果您使用 InnoDB,mysqldump这是您唯一真正安全的选择,除非您正在传输一切

答案3

要通过 ssh 快速将数据库复制到远程主机,您可以使用:

mysqldump | gzip | ssh remotehost sh -c 'gunzip | mysql'

另外,直接在命令行上指定密码通常也是不好的做法。

答案4

如果您想导入压缩数据库,可以使用此命令。

zcat mydatabase.sql.gz | mysql -u root -ppass --host=xxx.xx.xxx.xx --port=3306 -C mydatabase

相关内容