或者--single-transaction;
?
另外还需要知道该一致性备份的数据,对应的master上的binary log的文件名,以及在该文件中的position,所以必须启用 master-data选项。
?
因为--master-data会启用--lock-all-tables 所以数据才是一致性的;但是导致了全局锁,不能进行任何修改操作;下面我们使用--single-transaction进行优化:
?
mysqldump -uroot -p --routines --flush-logs --single-transaction --master-data=2 --databases db1 db2 > /root/backup.sql; (--flush-logs非必须)
?
这样全局锁仅仅在备份的开始短暂的持有。不会再备份的整个过程中持有全局锁。
?
4)在slave上执行备份的脚本,然后连上master,开启复制线程:
?
执行sql脚本:
?
mysql> source /tmp/backup.sql
找到 --master-data 输出的 binary log 的文件名和postion:
?
[root@localhost ~]# head -50 /tmp/backup.sql
......
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000010', MASTER_LOG_POS=809;
执行 change master to, start slave:
?
在salve上执行命令开始复制:
mysql> change master to master_host='192.168.137.8', master_user='repl', master_password='123456',
? ? -> master_log_file='mysql-bin.000010', master_log_pos=809;
Query OK, 0 rows affected, 2 warnings (0.09 sec)
?
mysql> start slave;
Query OK, 0 rows affected (0.04 sec)
?
最后在slave上查看复制线程的状态:
?
mysql> show slave status\G
... ...
? ?Slave_IO_Running: Yes
? Slave_SQL_Running: Yes
......
slave_IO_Runing 和 slave_sql_runing 状态都是yes表示搭建成功。
?
5)replication涉及到的三个线程:
1> master上的 binlog dump(dump线程),即读取master上的binlog,发送到slave上的线程。
2> slave上的IO线程:读取slave上的relay log。
3> slave上的sql线程:执行IO线程读取的relay log的线程。?
?
4. 使用mysqldump的备份进行 还原
?
下面使用 mysqldump 进行一个备份,然后删除 datadir, 然后使用备份sql脚本和binary log进行还原的过程。
?
1)首先进行一个全备:
?
mysqldump -uroot -p --single-transaction --master-data=2 --routines --flush-logs --databases gs ngx_lua > gs_ngx_lua_backup.sql;
?
2)将 备份时刷新之后的 binary log 利用 mv 命令移动到安全的位置,也就是--master-data=2输出的日志文件,它之前的日志文件都存储到安全的位置:
?
[root@localhost ~]# head -n 50 gs_ngx_lua_backup.sql
-- MySQL dump 10.13 Distrib 5.6.26, for linux-glibc2.5 (i686)
--
-- Host: localhost Database: gs
... ...--
-- Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000027', MASTER_LOG_POS=120;
?
?
也就是将 MASTER_LOG_FILE='mysql-bin.000027' 之前的日志都存储到其它位置。
?
然后执行:purge binary logs to 'mysql-bin.000027' 更新了 mysql-bin.index 中的索引信息,这里并没有删除binary log,因为它们已经被mv走了。
?
3)下面模拟一个 增量备份:
?
?
mysql> delete from user where id=5;
Query OK, 1 row affected (0.02 sec)
mysql> select * from user;
+----+----------+------+-------------+----------+
| id | name| sex | phone | addr|
+----+----------+------+-------------+----------+
| 1 | yuanfang | 1 | 14465463786 | hangzhou |
| 2 | Andy| 0 | 14465463786 | beijing |
| 3 | peter | 0 | 14465463786 | Hongkong |
| 4 | lexin | 1 | 36565634 | shenzhen |
+----+----------+------+-------------+----------+
4 rows in set (0.00 sec)
mysql> flush logs;
Query OK, 0 rows affected (0.11 sec)
mysql> show binary logs;
+------------------+--