Mysql Binlog

  • 原文:https://www.cnblogs.com/martinzhang/p/3454358.html

  • 參考阿里雲《自建數據庫使用RDS for MySQL備份按時間點恢復數據》:
    https://help.aliyun.com/knowledge_detail/41738.html?spm=5176.13910061.0.0.50af60ac2luY8p&aly_as=XJ7v6lD2

  • 參考《linux中mysql的安裝》:
    https://blog.csdn.net/qq_34354257/article/details/90475791

  • 參考《binlog配置失敗》:
    https://www.cnblogs.com/jpfss/p/11112283.html

一 開啓binlog功能

1.查看當前MySQL 慢查詢日誌是否開啓

mysql> show variables like 'log_%'; 
+----------------------------------------+---------------------+
| Variable_name                          | Value               |
+----------------------------------------+---------------------+
| log_bin                                | OFF                 |

結果:沒有開啓慢查詢

2.開啓慢查詢

2.1 修改 /etc/my.cnf 配置文件,在[mysqld]區塊下添加下面內容
注:我測試時發現需要把log-bin放到server-id後面,否則啓動mysql服務失敗

server-id=1
log-bin=mysql-bin

2.2 重啓mysql服務

systemlctl restart mysqld

3.驗證是否開啓

mysql> show variables like 'log_%';
+----------------------------------------+--------------------------------+
| Variable_name                          | Value                          |
+----------------------------------------+--------------------------------+
| log_bin                                | ON                             |

4.默認binlog的存放路徑在/var/lib/mysql

[root@Alibaba-Mark mysql]# ls  /var/lib/mysql | grep mysql-bin
mysql-bin.000001
mysql-bin.index

二 相關命令
1.查看所有binlog日誌列表

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       154 |
+------------------+-----------+

2.查看master狀態,即最後(最新)一個binlog日誌的編號名稱,及其最後一個操作事件pos結束點(Position)值

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |`在這裏插入代碼片`

3.刷新log日誌,自此刻開始產生一個新編號的binlog日誌文件

mysql> flush logs;
Query OK, 0 rows affected (0.10 sec)

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       201 |
| mysql-bin.000002 |       154 |
+------------------+-----------+
2 rows in set (0.00 sec)

三 實驗 邏輯備份+binlog備份恢復數據

1.數據準備,創建一個db_test數據庫,創建一張tb_test的表,然後插入一下數據;

mysql> create database db_test;
Query OK, 1 row affected (0.02 sec)

mysql> use db_test;
Database changed
mysql> 
mysql> CREATE TABLE IF NOT EXISTS `tb_test`(
    ->    `id` INT UNSIGNED AUTO_INCREMENT,
    ->    `title` VARCHAR(100) NOT NULL,
    ->    `author` VARCHAR(40) NOT NULL,
    ->    `date` DATE,
    ->    PRIMARY KEY ( `id` )
    -> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.25 sec)

mysql> INSERT INTO tb_test
    -> (title, author, date)
    -> VALUES
    -> ("test1", "mark'", NOW());
Query OK, 1 row affected, 1 warning (0.04 sec)

mysql> INSERT INTO tb_test
    -> (title, author, date)
    -> VALUES
    -> ("test2", "mark'", NOW());
Query OK, 1 row affected, 1 warning (0.02 sec)

mysql> select * from tb_test;
+----+-------+--------+------------+
| id | title | author | date       |
+----+-------+--------+------------+
|  1 | test1 | mark'  | 2020-03-08 |
|  2 | test2 | mark'  | 2020-03-08 |
+----+-------+--------+------------+
2 rows in set (0.00 sec)

3.備份文件(模擬定時備份數據)

[root@Alibaba-Mark ~]# mysqldump -u[數據庫用戶名] -p[用戶名密碼] -lF  -B db_test > /root/BAK.db_test.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@Alibaba-Mark ~]# ls /root |grep BAK
BAK.db_test.sql

4.插入或修改數據(模擬備份完成後有數據的修改操作)

mysql> INSERT INTO tb_test
    -> (title, author, date)
    -> VALUES
    -> ("test3", "mark'", NOW());
Query OK, 1 row affected, 1 warning (0.04 sec)

mysql> 
mysql> update tb_test set title = "new title" where id =1;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from tb_test;
+----+-----------+--------+------------+
| id | title     | author | date       |
+----+-----------+--------+------------+
|  1 | new title | mark'  | 2020-03-08 |
|  2 | test2     | mark'  | 2020-03-08 |
|  3 | test3     | mark'  | 2020-03-08 |
+----+-----------+--------+------------+
3 rows in set (0.01 sec)

5.刪除db_test(模擬數據庫被誤刪除了)

mysql> drop database db_test;
Query OK, 1 row affected (0.11 sec)

mysql> select * from tb_test;
ERROR 1046 (3D000): No database selected

6.通過備份文件恢復主要的數據

[root@Alibaba-Mark ~]# mysql -u[數據用戶名] -p[數據庫用戶密碼] -h127.0.0.1 < /root/BAK.db_test.sql
mysql> show databases;
+---------------------+
| Database            |
+---------------------+
| db_test             |
+---------------------+
mysql> use db_test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from tb_test;
+----+-------+--------+------------+
| id | title | author | date       |
+----+-------+--------+------------+
|  1 | test1 | mark'  | 2020-03-08 |
|  2 | test2 | mark'  | 2020-03-08 |
+----+-------+--------+------------+
2 rows in set (0.00 sec)

3.通過binlog恢復

mysql> show binlog events in 'mysql-bin.000003';
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                                                                                                                                                                                                                                              |
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| mysql-bin.000003 |    4 | Format_desc    |         1 |         123 | Server ver: 5.7.22-log, Binlog ver: 4                                                                                                                                                                                                                             |
| mysql-bin.000003 |  123 | Previous_gtids |         1 |         154 |                                                                                                                                                                                                                                                                   |
| mysql-bin.000003 |  154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                                                                              |
| mysql-bin.000003 |  219 | Query          |         1 |         302 | BEGIN                                                                                                                                                                                                                                                             |
| mysql-bin.000003 |  302 | Table_map      |         1 |         362 | table_id: 108 (db_test.tb_test)                                                                                                                                                                                                                                   |
| mysql-bin.000003 |  362 | Write_rows     |         1 |         418 | table_id: 108 flags: STMT_END_F                                                                                                                                                                                                                                   |
| mysql-bin.000003 |  418 | Xid            |         1 |         449 | COMMIT /* xid=455 */                                                                                                                                                                                                                                              |
| mysql-bin.000003 |  449 | Anonymous_Gtid |         1 |         514 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                                                                              |
| mysql-bin.000003 |  514 | Query          |         1 |         589 | BEGIN                                                                                                                                                                                                                                                             |
| mysql-bin.000003 |  589 | Table_map      |         1 |         649 | table_id: 108 (db_test.tb_test)                                                                                                                                                                                                                                   |
| mysql-bin.000003 |  649 | Update_rows    |         1 |         731 | table_id: 108 flags: STMT_END_F                                                                                                                                                                                                                                   |
| mysql-bin.000003 |  731 | Xid            |         1 |         762 | COMMIT /* xid=463 */                                                                                                                                                                                                                                              |
| mysql-bin.000003 |  762 | Anonymous_Gtid |         1 |         827 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                                                                              |
| mysql-bin.000003 |  827 | Query          |         1 |         928 | drop database db_test                                                                                                                                                                                                                                             |

[root@Alibaba-Mark ~]# mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/mysql-bin.000003 > /root/mysql-binlog.log
[root@Alibaba-Mark ~]# ls /root |grep .log
mysql-binlog.log
[root@Alibaba-Mark ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000003 --start-position=4 --stop-position=827 | mysql -umark -p7561669Dong! -P3306 -h127.0.0.1
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> selct * from tb_test;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'selct * from tb_test' at line 1
mysql> 
mysql> 
mysql> select * from tb_test;
+----+-----------+--------+------------+
| id | title     | author | date       |
+----+-----------+--------+------------+
|  1 | new title | mark'  | 2020-03-08 |
|  2 | test2     | mark'  | 2020-03-08 |
|  3 | test3     | mark'  | 2020-03-08 |
+----+-----------+--------+------------+
3 rows in set (0.00 sec)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章