1.延時同步概念
通過人為配置從庫和主庫延時N小時可以實現延時同步,延時同步可以解決數據庫故障出現的數據丟失問題(物理損壞如直接使用rm刪除數據庫數據和邏輯損壞如使用drop命令刪除數據庫)
2.延時同步實操
2.1先配置從庫延時同步,并且設置sql線程300秒后讀取relay log
mysql> stop replica;
mysql> CHANGE REPLICATION SOURCE TO SOURCE_DELAY = 300;
mysql>start replica;
mysql> show replica status\G
SQL_Delay: 300 #在這里可以查看到延時時間已經設置為300秒
SQL_Remaining_Delay: NULL
2.2主庫上創建庫和表
#創建數據庫為relay
mysql> create database relay;
mysql> use relay
#創建表
mysql> create table t1(id int);
mysql> insert into t1 values (1);
#刪除表
mysql> drop database relay;
2.3從庫上查看sql線程及找到誤刪數據的位置
#查看sql線程時間
mysql> show slave status \GSQL_Delay: 300SQL_Remaining_Delay: 279
#在sql線程延遲300秒時間內發現誤刪除數據庫則立馬停止從庫的sql線程
mysql> stop slave sql_thread;
#找到誤刪前relay log的起點和終點
mysql> show replica status\GRelay_Log_File: slave1-relay-bin.000002Relay_Log_Pos: 323 #當前讀取的relay日志的位置#輸入以下命令,找到誤刪數據的位置
mysql> show relaylog events in "slave1-relay-bin.000002";
2.4從庫進行備份,并解除從庫身份變成主庫
#將relay log進行備份
[root@rep1 mysql]# mysqlbinlog --start-position=323 --stop-position=1053 /data/mysql/slave1-relay-bin.000002 > /tmp/relay.sql#恢復誤刪除的數據庫
[root@rep1 mysql]# mysql -uroot -p -e 'source /tmp/relay.sql'
#查看數據是否恢復
mysql> select * from relay.t1;
+------+
| id |
+------+
| 1 |
+------+#解除從庫身份
mysql> stop replica;
mysql> reset replica all;
2.5從庫變主庫,備份誤刪的庫到/backup/jeams
[root@mysql-mster172 ~]# mkdir /backup
[root@mysql-mster172 ~]# mysqldump -uroot -p123 --all-databases > /backup/jeams.sql
#scp傳輸過去
[root@mysql-mster172 ~]# scp /backup/jeams.sql 192.168.75.171:~
2.6將之前的主庫給初始化,變為現在的從庫
#刪除之前mysql所存儲的文件
[root@mysql-master171 ~]# rm -rf /data/mysql/*
#進行初始化
[root@mysql-master171 ~]# mysqld --initialize --user=mysql
#啟動mysql
[root@mysql-master171 ~]# /etc/init.d/mysqld start
#登錄mysql,在上一條會給出初始密碼
[root@mysql-master171 ~]# mysql -uroot -poERi2Hf,7x.B
#修改密碼為123,然后輸入時會讓添密碼,這時再次輸入給出的初始密碼即可
[root@mysql-master171 ~]# mysqladmin -uroot -p password '123'
#將從新主庫發送來的備份數據傳輸到mysql里
[root@mysql-master171 ~]#mysql -uroot -p < ~/jeams.sql
#查看庫是否更新新主庫里面的內容
[root@mysql-master171 ~]# mysql -uroot -p -e 'show databases;'
#登錄密碼為123即可
[root@mysql-master171 ~]# mysql -uroot -p123
2.7進入新主庫創建賬戶
#登錄mysql
[root@mysql-mster172 ~]# mysql -uroot -p123
#創建用戶為rep并設置密碼rep123,允許任何主機登錄
mysql> create user 'rep'@'%' identified by 'rep123';
#給用戶rep權限
mysql> grant replication slave on *.* to 'rep'@'%';
#查看權限
mysql> show grants for 'rep'@'%';
+---------------------------------------------+
| Grants for rep@% |
+---------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `rep`@`%` |
+---------------------------------------------+
2.8舊主庫進行從庫的配置
2.8.1查看新主庫的狀態,即當前日志文件名和二進制日志偏移量
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000008 | 324 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2.8.2之前的舊主庫進行新從庫的配置
#登錄mysql
[root@mysql-master171 ~]# mysql -uroot -p123
#設定從庫向主庫同步
mysql> CHANGE REPLICATION SOURCE TO-> SOURCE_HOST='192.168.75.172', #主庫的ip地址-> SOURCE_USER='rep', #主庫mysql賬戶-> SOURCE_PASSWORD='rep123', #主庫mysql賬戶密碼-> SOURCE_LOG_FILE='binlog.000008 ', #主庫的文件-> SOURCE_LOG_POS=324, #主庫的位置-> SOURCE_SSL=1;
Query OK, 0 rows affected, 2 warnings (0.06 sec)mysql> start replica;
Query OK, 0 rows affected (0.01 sec)mysql> show replica status\G
3.測試
3.1在新主庫創建庫,并在新從庫查看
新主庫:
mysql> create database haha;
Query OK, 1 row affected (0.01 sec)
新從庫:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| haha |
| information_schema |
| mysql |
| performance_schema |
| relay |
| sys |
+--------------------+
7 rows in set (0.00 sec)
3.2在新主庫創建表,并在新從庫查看
新主庫:
mysql> use haha;
Database changed
mysql> create table t1(id int);
Query OK, 0 rows affected (0.06 sec)mysql> insert into t1 values(1);
Query OK, 1 row affected (0.01 sec)
新從庫:
mysql> select * from haha.t1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)