成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

使用python腳本實現(xiàn)mysql誤操作的flushback

1.簡介
在oracle數(shù)據(jù)庫中,當一個誤操作被提交后,我們可以通過oracle提供的閃回功能將表閃回至誤操作之前的狀態(tài)。MySQL中沒有原生的flushback功能,DBA誤操作時,傳統(tǒng)的恢復方式是利用全備+二進制日志前滾進行恢復。
今天給大家介紹一種使用python腳本在mysql中實現(xiàn)類似oracle中flushback table的閃回功能,相比于傳統(tǒng)的全備+增備,本方法更為快速、簡單。

潁上網站制作公司哪家好,找創(chuàng)新互聯(lián)!從網頁設計、網站建設、微信開發(fā)、APP開發(fā)、成都響應式網站建設公司等網站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)成立與2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創(chuàng)新互聯(lián)。

2.閃回原理
原理:調用mysql_rollback.py(腳本在我的另一篇blog 閃回腳本:mysql_rollback.py)對rows格式的binlog進行逆向操作,delete反向生成insert、update生成反向的update、insert反向生成delete。

3.說明
0、需安裝python及MySQLdb模塊
1、binlog的格式必須為row
2、要恢復的表操作前后表結構沒有發(fā)生變更,否則腳本無法解析
3、只生成DML(insert/update/delete)的rollback語句,DDL語句不可回滾
4、最終生成的SQL是逆序的,所以最新的DML會生成在輸入文件的最前面,并且?guī)狭藭r間戳和偏移點,方便查找目標
5、需要提供一個連接MySQL的只讀用戶,主要是為了獲取表結構
6、如果binlog過大,建議帶上時間范圍,也可以指定只恢復某個庫的SQL
7、SQL生成后,請務必在測試環(huán)境上測試恢復后再應用到線上

4.實戰(zhàn)
step1.登陸mysql查看表信息

mysql> use db1
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 test;
+------+-------+------+---------+----------+
| id   | name  | age  | country | city     |
+------+-------+------+---------+----------+
|    1 | alex  |   26 | china   | shanghai |
|    2 | bob   |   25 | britain | london   |
|    3 | simon |   24 | france  | paris    |
+------+-------+------+---------+----------+
3 rows in set (0.00 sec)

step2.模擬誤操作(update)

mysql> update test set country='europe' where name='bob';   --bob的國家被改為europe
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from test;
+------+-------+------+---------+----------+
| id   | name  | age  | country | city     |
+------+-------+------+---------+----------+
|    1 | alex  |   26 | china   | shanghai |
|    2 | bob   |   25 | europe  | london   |
|    3 | simon |   24 | france  | paris    |
+------+-------+------+---------+----------+
3 rows in set (0.00 sec)

mysql> exit;
Bye

step3.分析binlog并生成反向語句
找到最新的binlog

SZD-L0087668:gzz3306:Master > ll
-rw-rw---- 1 mysql mysql      167 May  2 14:30 mysql-bin.000001
-rw-rw---- 1 mysql mysql 11400402 May  2 19:28 mysql-bin.000002
-rw-rw---- 1 mysql mysql     1807 May  2 19:49 mysql-bin.000003
-rw-rw---- 1 mysql mysql      660 May  2 20:10 mysql-bin.000004
-rw-rw---- 1 mysql mysql      403 May  2 20:10 mysql-bin.000005
-rw-rw---- 1 mysql mysql      584 May  3 10:45 mysql-bin.000006
-rw-rw---- 1 mysql mysql      417 May  3 10:53 mysql-bin.000007
-rw-rw---- 1 mysql mysql     1973 May  3 13:28 mysql-bin.000008
-rw-rw---- 1 mysql mysql     2604 May  3 14:13 **mysql-bin.000009**
-rw-rw---- 1 mysql mysql      369 May  3 13:28 mysql-bin.index
-rw-r--r-- 1 root  root     12222 Apr 13  2017 mysql_rollback.py

根據(jù)關鍵詞europe查找binlog中的誤操作sql,并輸出europe前后30行(行數(shù)視具體情況而定,一定要輸出語句對應的BEGIN和COMMIT部分)

SZD-L0087668:gzz3306:Master > mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS --set-charset=utf8 mysql-bin.000009 | grep -C 30 'europe'
...
BEGIN
/*!*/;
# at 2426
#180503 14:13:36 server id 1  end_log_pos 2482 CRC32 0xe79b9612         Table_map: `db1`.`test` mapped to number 76
# at 2482
#180503 14:13:36 server id 1  end_log_pos 2573 CRC32 0xacd94a0b         Update_rows: table id 76 flags: STMT_END_F
### UPDATE `db1`.`test`
### WHERE
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
###   @2='bob' /* VARSTRING(30) meta=30 nullable=1 is_null=0 */
###   @3=25 /* INT meta=0 nullable=1 is_null=0 */
###   @4='britain' /* VARSTRING(30) meta=30 nullable=1 is_null=0 */
###   @5='london' /* VARSTRING(30) meta=30 nullable=1 is_null=0 */
### SET
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
###   @2='bob' /* VARSTRING(30) meta=30 nullable=1 is_null=0 */
###   @3=25 /* INT meta=0 nullable=1 is_null=0 */
###   @4='europe' /* VARSTRING(30) meta=30 nullable=1 is_null=0 */
###   @5='london' /* VARSTRING(30) meta=30 nullable=1 is_null=0 */
# at 2573
#180503 14:13:36 server id 1  end_log_pos 2604 CRC32 0x63b3d5fa         Xid = 118
COMMIT/*!*/;
...

選取2426和2604作為分析binlog的起始位置

SZD-L0087668:gzz3306:Master > python2.7 mysql_rollback.py -f mysql-bin.000009 -o rollback.sql -h227.0.0.1 -P3306 -uroot -p123456 --start-position='2426' --stop-position='2604' -d db1
正在獲取參數(shù).....
正在解析binlog.....
正在初始化列名.....
正在開始拼湊sql.....
done!

查看rollback.sql中誤操作的逆向語句

SZD-L0087668:gzz3306:Master > cat rollback.sql 
## at 2482
##180503 14:13:36 server id 1  end_log_pos 2573 CRC32 0xacd94a0b        Update_rows: table id 76 flags: STMT_END_F
UPDATE `db1`.`test`
SET
  id=2
  ,name='bob'
  ,age=25
  ,country='britain'
  ,city='london'
WHERE
  id=2
  AND name='bob'
  AND age=25
  AND country='europe'
  AND city='london';

step4.回滾

SZD-L0087668:gzz3306:Master > mysql -uroot -p <rollback.sql 
Enter password: 
SZD-L0087668:gzz3306:Master > mysql -uroot -p -e 'select * from db1.test';
Enter password: 
+------+-------+------+---------+----------+
| id   | name  | age  | country | city     |
+------+-------+------+---------+----------+
|    1 | alex  |   26 | china   | shanghai |
|    2 | bob   |   25 | britain | london   |
|    3 | simon |   24 | france  | paris    |
+------+-------+------+---------+----------+

test表已回滾。

網頁題目:使用python腳本實現(xiàn)mysql誤操作的flushback
當前路徑:http://jinyejixie.com/article14/gdppde.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供品牌網站制作、微信公眾號、Google、網頁設計公司做網站、搜索引擎優(yōu)化

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

商城網站建設
柳林县| 旬邑县| 芦溪县| 伊金霍洛旗| 陇南市| 出国| 博野县| 九龙城区| 九龙坡区| 青河县| 汝阳县| 宕昌县| 黎城县| 台前县| 青铜峡市| 夏邑县| 萨嘎县| 漳平市| 贺州市| 八宿县| 吴旗县| 九龙县| 罗平县| 犍为县| 桓台县| 阿拉善盟| 石柱| 夏邑县| 贵州省| 邛崃市| 皮山县| 岫岩| 高州市| 疏附县| 峨山| 五常市| 进贤县| 乐都县| 桓仁| 英吉沙县| 锡林浩特市|