1. 程式人生 > >mysql數據庫增量恢復多實例實戰演示

mysql數據庫增量恢復多實例實戰演示

mysql

mysql主從復制原理要點

1、異步方式同步

2、邏輯同步模式,多種模式,默認是通過sql語句執行

3、主庫通過記錄binlog實現對從庫的同步,binlog記錄數據庫的更新語句

4、主庫1IO線程,從庫由1IO線程和一個sql線程來完成的

5、從庫關鍵文件master.inforelay-logrelay-info功能

6、如果從庫還想級聯從庫,需要打開bin-loglog-slave-updates參數

mysql數據庫增量恢復多實例實戰演示

[[email protected]

*/ ~]# mysql -uroot -poldboy-S /data/3306/mysql.sock

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 8

Server version: 5.5.32-log Sourcedistribution

mysql> show variableslike ‘%character_set%‘; ##查看mysql字符集

+--------------------------+-------------------------------------------+

| Variable_name | Value |

+--------------------------+-------------------------------------------+

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | latin1 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | latin1 |

| character_set_system | utf8 |

| character_sets_dir | /application/mysql-5.5.32/share/charsets/|

+--------------------------+-------------------------------------------+

8 rows in set (0.02 sec)

mysql> create database oldboy; ##創建一個oldboy

Query OK, 1 row affected (0.01 sec)

mysql> use oldboy;

Database changed

mysql> create table test( id int(4) not null auto_increment, name char(20) notnull, primary key (id)); ##創建一個test

Query OK, 0 rows affected (0.11 sec)

mysql> show create table test; ##查看建表語句

+-------+------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table |

+-------+------------------------------------------------------------------------------------------------------------------------------------------------------+

| test | CREATE TABLE `test` (

`id` int(4) NOT NULL AUTO_INCREMENT,

`name` char(20) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.01 sec)

mysql> insert into test(id,name)values(1,‘oldboy‘); ##test表中插入數據

Query OK, 1 row affected (0.02 sec)

mysql> select * from test;

+----+--------+

| id | name |

+----+--------+

| 1| oldboy |

+----+--------+

1 row in set (0.01 sec)

mysql> insert into test(id,name)values(2,‘oldboy11‘); ##test表中插入數據oldboy11

Query OK, 1 row affected (0.01 sec)

mysql> insert into test(id,name)values(3,‘oldboy12‘); ##test表中插入數據oldboy12以此類推

Query OK, 1 row affected (0.00 sec)

mysql> select * from test; ##查看表中數據

+----+----------+

| id | name |

+----+----------+

| 1| oldboy |

| 2| oldboy11 |

| 3| oldboy12 |

| 4| oldboy13 |

| 5| oldboy14 |

| 6| oldboy15 |

+----+----------+

6 rows in set (0.00 sec)

mysql> quit

Bye

[[email protected] ~]# date -s ‘2016-06-28‘ ##在淩晨12點做備份

2016 06 28 星期二 00:00:00 CST

[[email protected] ~]# mysqldump -uroot -poldboy -S /data/3306/mysql.sock-F -B oldboy >/opt/quanbei.sql ##做一次全量備份

[[email protected] ~]# ll /opt/

總用量 524

-rw-r--r--. 1 root root 2087 6 28 00:02 quanbei.sql

-rw-r--r--. 1 root root 528847 5 26 01:40 rep.sql

[[email protected] ~]# mysql -uroot -poldboy-S /data/3306/mysql.sock

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 10

Server version: 5.5.32-log Sourcedistribution

mysql> use oldboy

Database changed

mysql> desc test;

+-------+----------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+----------------+

| id | int(4) | NO | PRI | NULL | auto_increment |

| name | char(20) | NO | | NULL | |

+-------+----------+------+-----+---------+----------------+

2 rows in set (0.01 sec)

mysql> insert into test(name)values(‘oldboy101‘); ##插入2條語句用來做增量

Query OK, 1 row affected (0.02 sec)

mysql> insert into test(name)values(‘oldboy102‘); ##插入語句用來做增量

Query OK, 1 row affected (0.00 sec)

mysql> select * from test;

+----+-----------+

| id | name |

+----+-----------+

| 1| oldboy |

| 2| oldboy11 |

| 3| oldboy12 |

| 4| oldboy13 |

| 5| oldboy14 |

| 6| oldboy15 |

| 7| oldboy101 |

| 8| oldboy102 |

+----+-----------+

8 rows in set (0.00 sec)

mysql> show databases; ##刪除之前查看oldboy

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| oldboy |

| performance_schema |

| test |

+--------------------+

5 rows in set (0.00 sec)

mysql> drop database oldboy; ##刪除oldboy

Query OK, 1 row affected (0.03 sec)

mysql> show databases; #刪除之後查看oldboy,沒有了

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| test |

+--------------------+

4 rows in set (0.00 sec)

mysql> quit;

Bye

[[email protected] ~]# ll /opt/ ##查看備份數據目錄

總用量 524

-rw-r--r--. 1 root root 2087 6 28 00:02 quanbei.sql

-rw-r--r--. 1 root root 528847 5 26 01:40 rep.sql

[[email protected] ~]# cd /data/3306/ ##查看數據庫的binlog日誌

[[email protected] 3306]# ll

總用量 32

drwxr-xr-x. 5 mysql mysql 4096 6 28 00:07 data

-rw-r--r--. 1 mysql mysql 1899 5 26 00:35 my.cnf

-rwxr-xr-x. 1 mysql mysql 1307 5 26 00:41 mysql

-rw-rw----. 1 mysql mysql 2290 6 28 00:02 mysql-bin.000001

-rw-rw----. 1 mysql mysql 656 6 28 00:07 mysql-bin.000002 ##binlog位置點

-rw-rw----. 1 mysql mysql 56 6 28 00:02 mysql-bin.index

-rw-rw----. 1 mysql mysql 6 5 26 00:57 mysqld.pid

-rw-r-----. 1 mysql root 2669 5 26 01:39 mysql_oldboy3306.err

srwxrwxrwx. 1 mysql mysql 0 5 26 00:57 mysql.sock

[[email protected] 3306]# mysqladmin -uroot -poldboy -S/data/3306/mysql.sock flush-logs ##不確定binlog位置點的情況下,用mysqladmin刷新binlog日誌,新生成binlog之前就是恢復binlog位置點,也根據時間點確定是不是淩晨12操作的

[[email protected] 3306]# ll

總用量 36

drwxr-xr-x. 5 mysql mysql 4096 6 28 00:07 data

-rw-r--r--. 1 mysql mysql 1899 5 26 00:35 my.cnf

-rwxr-xr-x. 1 mysql mysql 1307 5 26 00:41 mysql

-rw-rw----. 1 mysql mysql 2290 6 28 00:02 mysql-bin.000001

-rw-rw----. 1 mysql mysql 699 6 28 00:17 mysql-bin.000002

-rw-rw----. 1 mysql mysql 107 6 28 00:17 mysql-bin.000003 ##新生成的binlog

-rw-rw----. 1 mysql mysql 84 6 28 00:17 mysql-bin.index

-rw-rw----. 1 mysql mysql 6 5 26 00:57 mysqld.pid

-rw-r-----. 1 mysql root 2669 5 26 01:39 mysql_oldboy3306.err

srwxrwxrwx. 1 mysql mysql 0 5 26 00:57 mysql.sock

[[email protected] 3306]# cp mysql-bin.000002/opt/

[[email protected] 3306]# ll /opt/

總用量 528

-rw-r-----. 1 root root 699 6 28 00:18 mysql-bin.000002

-rw-r--r--. 1 root root 2087 6 28 00:02 quanbei.sql

-rw-r--r--. 1 root root 528847 5 26 01:40 rep.sql

[[email protected] 3306]# mysqlbinlog -d oldboy /opt/mysql-bin.000002##查看binlog日誌內容

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;

/*!40019 SET@@session.max_insert_delayed_threads=0*/;

/*!50003 [email protected]_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

DELIMITER /*!*/;

[[email protected]]# cd /opt/

[[email protected]]# mysqlbinlog -d oldboy mysql-bin.000002>bin.sql ##binlog放到bin.sql

[[email protected]]# vi bin.sql ##vi編輯進去刪除drop數據的那條語句,保存退出

[[email protected] opt]# mysql -uroot-poldboy -S /data/3306/mysql.sock

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 13

Server version: 5.5.32-log Sourcedistribution

mysql> show variables like ‘log_bin‘;

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_bin | ON |

+---------------+-------+

1 row in set (0.00 sec)

mysql> quit

Bye

[[email protected] opt]# mysql -uroot-poldboy -S /data/3306/mysql.sock <quanbei.sql ##主庫恢復全備

[[email protected] opt]# mysql -uroot-poldboy -S /data/3306/mysql.sock oldboy <bin.sql ##再恢復binlog

[[email protected] opt]# mysql -uroot -poldboy-S /data/3306/mysql.sock

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 17

Server version: 5.5.32-log Sourcedistribution

mysql> select * from oldboy test; ##進入數據庫查看,此時數據已恢復

ERROR 1046 (3D000): No database selected

mysql> select * from oldboy.test;

+----+-----------+

| id | name |

+----+-----------+

| 1| oldboy |

| 2| oldboy11 |

| 3| oldboy12 |

| 4| oldboy13 |

| 5| oldboy14 |

| 6| oldboy15 |

| 7| oldboy101 |

| 8| oldboy102 |

+----+-----------+

8 rows in set (0.00 sec)

mysql>

增量恢復小結:

1、人為sql造成的誤操作

2、要有全備和增量

3、恢復時建議對外停止更新

4、恢復全量,然後把增量日誌中有問題的sql語句刪除,恢復到數據庫

總結數據庫增量恢復:

1、停止一個從庫,主庫刷新binlog,把mysql-bin-000002恢復成bin.sql (vi bin.sql)

去掉刪除的語句,/drop搜索刪除的語句,在vi裏幹掉

2、把全備quanbei.sql10點前的增量bin.sql恢復到從庫

3、數據丟多少? 10:10分刷新binlog以後的數據mysql-bin.000003

4、停止主庫,快速把mysql-bin.000003解析為sql,恢復到從庫。

5、切換到從庫提供服務

增量恢復的核心思想:

1、流程制度控制,防止問題發生,如果不做,面臨服務和數據丟失問題

2、通過延遲備份來解決,或者監控、黑名單、白名單機制

3、業務需求容忍度,選擇停庫或鎖表或容忍丟失部分數據


本文出自 “Arthur” 博客,請務必保留此出處http://sumous.blog.51cto.com/10483407/1948132

mysql數據庫增量恢復多實例實戰演示