国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MySQL數據閃回

IT那活兒 / 1328人閱讀
MySQL數據閃回

點擊上方“IT那活兒”,關注后了解更多內容,不管IT什么活兒,干就完了!!!



背景描述


開發人員在線上環境更新或者誤刪除了數據,并且影響比較大,就需要能快速的回滾。
傳統恢復的方法是利用備份重新搭建實例的方式來進行恢復,但如果數據量比較大的情況下,這樣的做法顯然會付出比較大的代價。
接下來介紹一種高效的數據閃回工具:binlog2sql


方案描述


1. 適用范圍:
  • MySQL

  • 平臺:Linux

2. 閃回原理:
MySQL binlog 以 event 為單位,記錄數據庫的變更信息,這些信息能夠幫助我們重現這之間的所有變化,也就是所謂的閃回。利用 binlog 做閃回,需要將 binlog 格式設置為 row,因為我們需要最詳盡的信息來確定操作之后數據不會出錯。
既然 binlog 以 event 形式記錄了所有的變更信息,那么我們把需要回滾的 event,從后往前回滾回去即可。
3. 回滾操作:
1)對于 delete 操作,我們從 binlog 提取出 delete 信息,反向生成 insert 回滾語句;
2)對于 insert 操作,反向生成 delete 回滾語句;
3)對于 update 操作,根據信息生成反向的 update 語句。
4. 前提要求:
1)mysql配置要求:
[mysqld]
server_id = 1
log_bin = /data/mysql/log/binary/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full
2)用戶權限要求
SELECT, REPLICATION SLAVE, REPLICATION CLIENT。
  • select:需要讀取server端information_schema.COLUMNS表,獲取表結構的元信息,拼接成可視化的sql語句

  • super/replication client:兩個權限都可以,需要執行SHOW MASTER STATUS, 獲取server端的binlog列表

  • replication slave:通過BINLOG_DUMP協議獲取binlog內容的權限

3)binlog2sql的使用參數說明:
  • mysql連接配置

    -h host; -P port; -u user; -p password
  • 解析模式

    --stop-never 持續同步binlog。可選。不加則同步至執行命令時最新的binlog位置。
    -K, --no-primary-key 對INSERT語句去除主鍵。可選。
    -B, --flashback 生成回滾語句,可解析大文件,不受內存限制,每打印一千行加一句SLEEP SELECT。可選。與stop-never或no-primary-key不能同時添加。
  • 解析范圍控制

    --start-file 起始解析文件。必須。
    --start-position/--start-pos start-file的起始解析位置。可選。默認為start-file的起始位置。
    --stop-file/--end-file 末尾解析文件。可選。默認為start-file同一個文件。若解析模式為stop-never,此選項失效。
    --stop-position/--end-pos stop-file的末尾解析位置。可選。默認為stop-file的最末位置;若解析模式為stop-never,此選項失效。
    --start-datetime 從哪個時間點的binlog開始解析,格式必須為datetime,如2016-11-11 11:11:11。可選。默認不過濾。
    --stop-datetime 到哪個時間點的binlog停止解析,格式必須為datetime,如2016-11-11 11:11:11。可選。默認不過濾。
  • 對象過濾

    -d, --databases 只輸出目標db的sql。可選。默認為空。
    -t, --tables 只輸出目標tables的sql。可選。默認為空。
5. 操作步驟:
1)進行用戶授權,以下測試使用root用戶,故不在創建新的用戶。
2)測試庫測試:
mysql> show global variables like binlog_format;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
|
 binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec)

mysql>

mysql> show master status;
+------------------+----------+
| File | Position |
+------------------+----------+
|
 mysql-bin.000107 | 120 |
+------------------+----------+
1 row in set (0.00 sec)

mysql> select * from tb1;
+------+------+
| id | name |
+------+------+
|
    1 | aa |
| 2 | bb |
+------+------+
2 rows in set (0.00 sec)

mysql>
3)進行數據的DML操作:
mysql>  insert into tb1 values (3,cc);
Query OK, 1 row affected (0.00 sec)

mysql>
  insert into tb1 values (4,dd);
Query OK, 1 row affected (0.00 sec)

mysql>
  update tb1 set name=new_aa where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql>
  delete from tb1 where id=2;
Query OK, 1 row affected (0.00 sec)

mysql>
  select * from tb1;
+------+--------+
| id | name |
+------+--------+
| 1 | new_aa |
| 3 | cc |
| 4 | dd |
+------+--------+
3 rows in set (0.00 sec)

mysql>
4)使用binlog2sql進行格式為ROW的binlog生成標準SQL,帶個-d的參數指定庫名:
[root@db_server_xuanzhi ~]#python binlog2sql.py -uroot -h127.0.0.1 -proot -dxuanzhi --start-file=mysql-bin.000107 > xuanzhi.sql
[root@db_server_xuanzhi ~]#cat xuanzhi.sql
INSERT INTO `xuanzhi`.`tb1`(`id`, `name`) VALUES (3, cc); #start 4 end 290 time 2022-01-23 10:41:34
INSERT INTO `xuanzhi`.`tb1`(`id`, `name`) VALUES (4, dd); #start 321 end 491 time 2022-01-23 10:41:38
UPDATE `xuanzhi`.`tb1` SET `id`=1, `name`=new_aa WHERE `id`=1 AND `name`=aa LIMIT 1; #start 522 end 705 time 2022-01-23 10:41:42
DELETE FROM `xuanzhi`.`tb1` WHERE `id`=2 AND `name`=bb LIMIT 1; #start 736 end 906 time 2022-01-23 10:41:50
[root@db_server_xuanzhi ~]#
5)對xuanzhi這個庫的所有操作生成反向SQL,這個時候需要在上面語句的基礎上帶一個-B參數,就是flashback閃回的意思:
[root@db_server_xuanzhi ~]#python binlog2sql.py -uroot -h127.0.0.1 -proot -dxuanzhi --start-file=mysql-bin.000107 -B > rollback_xuanzhi.sql
[root@db_server_xuanzhi ~]#cat rollback_xuanzhi.sql
INSERT INTO `xuanzhi`.`tb1`(`id`, `name`) VALUES (2, bb); #start 736 end 906 time 2022-01-23 10:41:50
UPDATE `xuanzhi`.`tb1` SET `id`=1, `name`=aa WHERE `id`=1 AND `name`=new_aa LIMIT 1; #start 522 end 705 time 2022-01-23 10:41:42
DELETE FROM `xuanzhi`.`tb1` WHERE `id`=4 AND `name`=dd LIMIT 1; #start 321 end 491 time 2022-01-23 10:41:38
DELETE FROM `xuanzhi`.`tb1` WHERE `id`=3 AND `name`=cc LIMIT 1; #start 4 end 290 time 2022-01-23 10:41:34
[root@db_server_xuanzhi ~]#
6)最后導入生成的回滾sql:
mysql>  use xuanzhi
Database changed
mysql>  source /tmp/rollback_xuanzhi.sql
可以看到正常恢復,但值得注意的是drop table 和truncate table 是無法生成反向SQL的,所以建議線上程序賬號只給insert,upfate,select,delete權限。



本文作者:趙棟輝

本文來源:IT那活兒(上海新炬王翦團隊)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129634.html

相關文章

  • MySQL誤操作后如何快速恢復數據

    摘要:基本上每個跟數據庫打交道的程序員當然也可能是你同事都會碰一個問題,誤操作后如何快速回滾比如,一張表,忘加限制條件,整張表都沒了。誤操作后,能快速回滾數據是非常重要的。登錄確認,數據回滾成功。所以,誤操作的話一般只能通過備份來恢復。 基本上每個跟數據庫打交道的程序員(當然也可能是你同事)都會碰一個問題,MySQL誤操作后如何快速回滾?比如,delete一張表,忘加限制條件,整張表都沒了。...

    taohonghui 評論0 收藏0

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<