![MySQLDump 的 shell 管道行为](https://linux22.com/image/502903/MySQLDump%20%E7%9A%84%20shell%20%E7%AE%A1%E9%81%93%E8%A1%8C%E4%B8%BA.png)
我正在使用 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