互联网服务MySQL

mysqldump是否是在线的?

1:mysqldump发起备份,直到备份结束,这期间是否可以对库中的表进行增删改操作?显示全部

1:mysqldump发起备份,直到备份结束,这期间是否可以对库中的表进行增删改操作?

收起
参与5

返回冯帅的回答

冯帅冯帅  数据库管理员 , 贝壳金服

你可以使用mysqldump --help来查看具体的信息 也可以查看general_log看到备份时的细节 然后去理解它

之前有过一个实验 你可以看一下
我们开两个窗口,在第一个里面执行mysqldump -uroot -pxxxxx --master-data=2 --databases dbname > /tmp/dbnamedate +%F.sql
然后第二个窗口登陆进去,使用show process的命令可以看到目前dump的session正在执行 (图1)
SELECT /!40001 SQL_NO_CACHE / * FROM table_name; 可以看到这条sql正在以no_cache的模式查询数据。
然后我们在同样的表上执行一下select,发现被阻塞了。光标一直不返回。(图2)一般遇到这种文件,我们会想是不是有锁呢?
为了验证我们查看一下锁的信息,可以发现dump的进程实际上是加了锁的。(图3)

我们把具体的general_log打开,然后看一下当时的操作:(图4)

    4101044 Query    FLUSH /*!40101 LOCAL */ TABLES
    4101044 Query    FLUSH TABLES WITH READ LOCK  (关闭所有打开的表,同时对于所有数据库中的表都加一个读锁,直到显示地执行unlock tables,该操作常常用于数据备份的时候。)
    4101044 Query    SHOW MASTER STATUS(这是因为我用了--master-data=2)

所以这个时候表就会被锁住。
如果我不加--master-data参数(mysqldump -uroot -pxx --databases db > /tmp/dbnamedate +%F.sql) mysql会显示的对每一张要备份的表执行
LOCK TABLES table_name1 READ,LOCK TABLES table_name2 READ
并且也不会有读的阻塞。
带上--single-transaction参数的mysqldump备份过程:
如果是5.6版本的mysql(图5)
在备份之间同样的先FLUSH TABLES WITH READ LOCK,然后设置事务级别SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ,然后开启一个事务START TRANSACTION进行备份,这个时候备份的过程就很意思,它先创建了一个savepoint,然后把数据库里的表依次的进行备份,备份完成了之后又回滚到了之前的savepoint,来保证数据的一致性
如果是5.7版本的mysql(图6)
备份前的操作相同,只是没有了savepoint

不过不管是哪个版本,只有InnoDB表是在一个一致性的状态。其它的任何MyISAM表或内存表是没有用的。
mysqldump的优势是可以查看或者编辑十分方便,它也可以灵活性的恢复之前的数据。它也不关心底层的存储引擎,既适用于支持事务的,也适用于不支持事务的表。不过它不能作为一个快速备份大量的数据或可伸缩的解决方案。如果数据库过大,即使备份步骤需要的时间不算太久,但有可能恢复数据的速度也会非常慢,因为它涉及的SQL语句插入磁盘I/O,创建索引等等。
对于大规模的备份和恢复,更合适的做法是物理备份,复制其原始格式的数据文件,可以快速恢复:如果你的表主要是InnoDB表,或者如果你有一个InnoDB和MyISAM表,可以考虑使用MySQL的mysqlbackup命令备份

融资租赁 · 2018-07-24
浏览2523

回答者

冯帅
数据库管理员贝壳金服

冯帅 最近回答过的问题

回答状态

  • 发布时间:2018-07-24
  • 关注会员:2 人
  • 回答浏览:2523
  • X社区推广