MYSQL InnoDB引擎中有一个数据库。当我在linux服务器上通过mysqldump命令备份我的数据库大约150 GB时。我收到错误消息
mysqldump丢失连接。
有一张大小为105 GB的表,大约420 000 000行,每小时平均插入约10万行。备份在此表运行时出现错误。如何进行备份以及什么是万无一失的过程?
答案 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_packet的 一个数据包或任何生成/中间字符串的最大大小,或mysql_stmt_send_long_data()C API函数发送的任何参数。默认值为4MB。
数据包消息缓冲区初始化为net_buffer_length字节,但在需要时可以增长到max_allowed_packet 字节。
但是,备份将锁定数据库(或表)并导致服务问题。因此,您可能会更好,首先,设置复制,以便通过主服务器的持续更新使从服务器保持一致状态。当您需要备份时,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