如何备份表大小为105 GB的数据库?

时间:2018-03-13 07:17:23

标签: mysql backup

MYSQL InnoDB引擎中有一个数据库。当我在linux服务器上通过mysqldump命令备份我的数据库大约150 GB时。我收到错误消息

  

mysqldump丢失连接。

有一张大小为105 GB的表,大约420 000 000行,每小时平均插入约10万行。备份在此表运行时出现错误。如何进行备份以及什么是万无一失的过程?

4 个答案:

答案 0 :(得分:6)

Lost connection to MySQL server during query?& https://dba.stackexchange.com/questions/97846/mysqldump-error-2013

mysqldump命令行中添加这些参数:

--max_allowed-packet=1G --net-read-timeout=7200 --net-write-timeout=7200 --net-buffer-length=32704

答案 1 :(得分:1)

您可以使用WHERE子句在部分中进行备份,以将其拆分为多个文件。

您应该查找索引或者使用主键并使用几个mysqldump命令。请注意,数据不会同时是整个表的快照。

mysqldump -u root -p  dbName tableName --where="id>=10000 AND id<20000" > dbName_tableName_10_20.sql

考虑将表拆分为未来以便于维护。

答案 2 :(得分:1)

“丢失连接”问题是由转储渠道中的数据过多引起的 - 您需要在my.cnf中增加max_allowed_packet

我很久以前曾向我指出这一点,但现在重新阅读我不太确定适用的文档。无论如何,您可以尝试使用它,或者将其用于进一步研究:

  

请注意mysqldump将构建特殊的多个INSERT子句,这些子句可能会超出缓冲区长度。然后,您可能需要在备份时求助于--skip-extended-insert(这将大大减慢恢复速度)。

文档说:

  

的net_buffer_length      用于客户端/服务器通信的缓冲区的初始大小。在创建多行INSERT语句时(与--extended-insert或--opt选项一样),mysqldump会创建长达net_buffer_length个字节的行。如果增加此变量,请确保MySQL服务器net_buffer_length系统变量的值至少为此大。   [...]    max_allowed_pa​​cket的    一个数据包或任何生成/中间字符串的最大大小,或mysql_stmt_send_long_data()C API函数发送的任何参数。默认值为4MB。

     

数据包消息缓冲区初始化为net_buffer_length字节,但在需要时可以增长到max_allowed_pa​​cket 字节。

但是,备份将锁定数据库(或表)并导致服务问题。因此,您可能会更好,首先,设置复制,以便通过主服务器的持续更新使从服务器保持一致状态。当您需要备份时,lock the slave and set it to read only,然后可以运行mysqldump或只备份二进制数据(手册建议大型数据库)。

答案 3 :(得分:1)

请考虑这两件事

一个配置:

configured max_allowed_packet to 1024M
configured net_read_timeout to 7200
configured net_write_timeout to 7200

第二:

mysqldump -u root --skip-extended-insert -p <DB> DB.sql