MySQL 这么成熟的数据库,为什么用 mysqldump 老是要锁表,生产环境直接崩溃

2019-09-26 08:50:17 +08:00
 kisshere

MySQL5.7 版本,一张 800 万行的 MyISAM 表,准备每天定时备份,导出 SQL 至备份盘。因为是生产环境,肯定不能锁表,那样业务全都被锁死了,于是尝试各种方法:

mysqldump -u root -p --lock-tables=false MyDB MyTable>MyTable.sql //锁表卡死
mysqldump -u root -p --lock-tables=false --skip-add-locks MyDB MyTable>MyTable.sql //锁表卡死
mysqldump -u root -p --lock-tables=false --quick MyDB MyTable>MyTable.sql //锁表卡死
mysqldump -u root -p --compress --quick --triggers --routines --lock-tables=false --single-transaction MyDB MyTable>MyTable.sql //锁表卡死

用 show processlist 查看,一直卡在

SELECT /*!40001 SQL_NO_CACHE */ * FROM `MyTable`

目前根本不敢备份,用 mysqldump 就锁表,试了好多方法都不行,我快崩溃了,求 V 友数据大神帮忙

15683 次点击
所在节点    程序员
61 条回复
GTim
2019-09-26 08:55:52 +08:00
典型的不知道锁表的好处就来攻击锁表

对于 myisam 备份最快的方式是拷贝物理文件
wweir
2019-09-26 08:56:33 +08:00
人那么高级的物种,为什么吃饭的时候还要用餐具?吃饭的时候还要花时间洗餐具,直接崩溃
kisshere
2019-09-26 08:57:28 +08:00
@GTim 拷贝 MySQL 那些数据文件,以后 MySQL 版本升级了咋办,兼容性敢保证么
ixiaohei
2019-09-26 08:57:30 +08:00
物理拷贝;或者用 binlog 同步到备份数据库;然后对备份数据库 dump 出来,也会不影响生产
MeteorCat
2019-09-26 09:00:02 +08:00
楼上说的对,直接物理拷贝之后导入同版本 mysql 之后再 mysqldump 出来,虽然费点功夫但是安全和兼容性最高
lianxiaoyi
2019-09-26 09:02:10 +08:00
XtraBackup 了解一下,你这 800 万记录计算你 dump 出来了,当你要恢复的时候,没有半小时算我输。。。
但是物理备份就不一样了,800 万记录也就几秒钟的事情吧,恢复也就几秒钟的事情。
我写的简单使用方法,我个人自建的 mysql 就在使用。
http://notephp.com/?id=58
imNull
2019-09-26 09:07:33 +08:00
用 binlog
naix1573
2019-09-26 09:09:49 +08:00
mysql,你已经是个成熟的数据库了,应该学会自己备份。
TiggeYL
2019-09-26 09:12:51 +08:00
给你一条建议
你要是建立数据库之前开启了 binlog
https://github.com/alibaba/canal
可以尝试阿里云这个方法备份
TiggeYL
2019-09-26 09:13:22 +08:00
@TiggeYL 说错了 是阿里巴巴
GTim
2019-09-26 09:13:58 +08:00
@kisshere 谁吃饱了撑着没事干敢在没停机时升级数据库。如果非要升级数据库,你要先把网站关了,然后使用 dump 之类的导出数据库,然后再备份物理文件,然后再升级。

mysql 数据目录下的同名数据库里有三个表同名的文件,把那三个文件备份一下就好了
wd
2019-09-26 09:14:04 +08:00
myisam 换 innodb ?
nekolr
2019-09-26 09:16:42 +08:00
MyISAM 不使用共享表空间,直接物理复制数据库目录就可以了,然后放到相同版本的数据库中,再使用 dump 导出 sql。
DRcoding
2019-09-26 09:20:54 +08:00
mysqldump 是逻辑备份当然会锁表咯,所以还是花钱上云会方便很多,各种全量、增量备份,数据恢复都妥妥的。

生产环境的备份 LZ 去了解下 MySQL 如何热备份就好了。
love
2019-09-26 09:30:34 +08:00
印象中 MyISAM 表就是只能锁表的,innodb 就不会
siparadise
2019-09-26 09:31:13 +08:00
mysql 这么多存储引擎,偏要用 myisam 这东西 ... ...
lscho
2019-09-26 09:35:13 +08:00
MySQL 这么成熟的软件,竟然还有人用 mysqldump 热备份?业务量不大的话,推荐物理备份。中等的话,推荐 binlog。再往上我也不知道了。
siparadise
2019-09-26 09:35:37 +08:00
换个支持 mvcc 的存储引擎,就没这种问题了
fuye
2019-09-26 09:37:25 +08:00
--lock-tables=false 可以取消锁表,但是会导致数据的不一致

考虑 Innodb 引擎,就可以使用 --single-transaction 做全量一致性备份,配合--flush-logs 可以做增量备份

--lock-tables, -l
Lock all tables before dumping them. The tables are locked with READ
LOCAL to allow concurrent inserts in the case of MyISAM tables. For
transactional tables such as InnoDB and BDB, --single-transaction is
a much better option, because it does not need to lock the tables at
all.
love
2019-09-26 09:37:36 +08:00
@lscho 我的 vps 就是用 mysqldump 的,每天一次,数据量也不太小吧,备份时哪会锁死网站。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/604269

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX