成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

MySQL數(shù)據(jù)閃回

IT那活兒 / 1339人閱讀
MySQL數(shù)據(jù)閃回

點(diǎn)擊上方“IT那活兒”,關(guān)注后了解更多內(nèi)容,不管IT什么活兒,干就完了?。?!



背景描述


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


方案描述


1. 適用范圍:
  • MySQL

  • 平臺(tái):Linux

2. 閃回原理:
MySQL binlog 以 event 為單位,記錄數(shù)據(jù)庫(kù)的變更信息,這些信息能夠幫助我們重現(xiàn)這之間的所有變化,也就是所謂的閃回。利用 binlog 做閃回,需要將 binlog 格式設(shè)置為 row,因?yàn)槲覀冃枰钤敱M的信息來(lái)確定操作之后數(shù)據(jù)不會(huì)出錯(cuò)。
既然 binlog 以 event 形式記錄了所有的變更信息,那么我們把需要回滾的 event,從后往前回滾回去即可。
3. 回滾操作:
1)對(duì)于 delete 操作,我們從 binlog 提取出 delete 信息,反向生成 insert 回滾語(yǔ)句;
2)對(duì)于 insert 操作,反向生成 delete 回滾語(yǔ)句;
3)對(duì)于 update 操作,根據(jù)信息生成反向的 update 語(yǔ)句。
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)用戶權(quán)限要求
SELECT, REPLICATION SLAVE, REPLICATION CLIENT。
  • select:需要讀取server端information_schema.COLUMNS表,獲取表結(jié)構(gòu)的元信息,拼接成可視化的sql語(yǔ)句

  • super/replication client:兩個(gè)權(quán)限都可以,需要執(zhí)行SHOW MASTER STATUS, 獲取server端的binlog列表

  • replication slave:通過(guò)BINLOG_DUMP協(xié)議獲取binlog內(nèi)容的權(quán)限

3)binlog2sql的使用參數(shù)說(shuō)明:
  • mysql連接配置

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

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

    --start-file 起始解析文件。必須。
    --start-position/--start-pos start-file的起始解析位置??蛇x。默認(rèn)為start-file的起始位置。
    --stop-file/--end-file 末尾解析文件??蛇x。默認(rèn)為start-file同一個(gè)文件。若解析模式為stop-never,此選項(xiàng)失效。
    --stop-position/--end-pos stop-file的末尾解析位置??蛇x。默認(rèn)為stop-file的最末位置;若解析模式為stop-never,此選項(xiàng)失效。
    --start-datetime 從哪個(gè)時(shí)間點(diǎn)的binlog開(kāi)始解析,格式必須為datetime,如2016-11-11 11:11:11??蛇x。默認(rèn)不過(guò)濾。
    --stop-datetime 到哪個(gè)時(shí)間點(diǎn)的binlog停止解析,格式必須為datetime,如2016-11-11 11:11:11??蛇x。默認(rèn)不過(guò)濾。
  • 對(duì)象過(guò)濾

    -d, --databases 只輸出目標(biāo)db的sql??蛇x。默認(rèn)為空。
    -t, --tables 只輸出目標(biāo)tables的sql。可選。默認(rèn)為空。
5. 操作步驟:
1)進(jìn)行用戶授權(quán),以下測(cè)試使用root用戶,故不在創(chuàng)建新的用戶。
2)測(cè)試庫(kù)測(cè)試:
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)進(jìn)行數(shù)據(jù)的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進(jìn)行格式為ROW的binlog生成標(biāo)準(zhǔn)SQL,帶個(gè)-d的參數(shù)指定庫(kù)名:
[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)對(duì)xuanzhi這個(gè)庫(kù)的所有操作生成反向SQL,這個(gè)時(shí)候需要在上面語(yǔ)句的基礎(chǔ)上帶一個(gè)-B參數(shù),就是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)最后導(dǎo)入生成的回滾sql:
mysql>  use xuanzhi
Database changed
mysql>  source /tmp/rollback_xuanzhi.sql
可以看到正?;謴?fù),但值得注意的是drop table 和truncate table 是無(wú)法生成反向SQL的,所以建議線上程序賬號(hào)只給insert,upfate,select,delete權(quán)限。



本文作者:趙棟輝

本文來(lái)源:IT那活兒(上海新炬王翦團(tuán)隊(duì))

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/129634.html

相關(guān)文章

  • MySQL誤操作后如何快速恢復(fù)數(shù)據(jù)

    摘要:基本上每個(gè)跟數(shù)據(jù)庫(kù)打交道的程序員當(dāng)然也可能是你同事都會(huì)碰一個(gè)問(wèn)題,誤操作后如何快速回滾比如,一張表,忘加限制條件,整張表都沒(méi)了。誤操作后,能快速回滾數(shù)據(jù)是非常重要的。登錄確認(rèn),數(shù)據(jù)回滾成功。所以,誤操作的話一般只能通過(guò)備份來(lái)恢復(fù)。 基本上每個(gè)跟數(shù)據(jù)庫(kù)打交道的程序員(當(dāng)然也可能是你同事)都會(huì)碰一個(gè)問(wèn)題,MySQL誤操作后如何快速回滾?比如,delete一張表,忘加限制條件,整張表都沒(méi)了。...

    taohonghui 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<