我们把具体的general_log打开,然后看一下当时的操作:
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把备份的操作放在一个事务里去进行。
带上--single-transaction参数的mysqldump备份过程:
如果是5.6版本的MySQL
在备份之间同样的先FLUSH TABLES WITH READ LOCK,然后设置事务级别SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ,然后开启一个事务START TRANSACTION进行备份,这个时候备份的过程就很意思,它先创建了一个savepoint,然后把里的表依次的进行备份,备份完成了之后又回滚到了之前的savepoint,来保证数据的一致性。
如果是5.7版本的MySQL
备份前的操作相同,只是没有了savepoint。
恢复操作:
先看一下当前的数据:
dbadmin@test 11:10:34>select * from t;
+-------+
| id |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)
备份;
mysqldump -uroot -proot@1234 --master-data=1 test >test.sql
模拟增量操作:
dbadmin@test 11:15:17>insert into t values (2);
Query OK, 1 row affected (0.00 sec)
dbadmin@test 11:15:36>select * from t; +------+ | id | +------+ | 1 | | 2 | +------+ 2 rows in set (0.00 sec)
模拟误操作:
dbadmin@test 11:15:41>truncate table t;
Query OK, 0 rows affected (0.01 sec)
dbadmin@test 11:16:14>select * from t;
Empty set (0.00 sec)
模拟恢复操作:
step 1:找到误操作的log position
dbadmin@test 11:20:57>show master logs;
dbadmin@(none) 11:21:37>show binlog events in 'mysql-bin.000004';
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shouji/article-51609-2.html
对于美国人对我岛礁建设提出的意见对我有利的将坚决采纳
中国暂时不想把关系弄得太坏