-
原文: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)