MySQLデータベースの誤操作後の高速ロールバック方法
7093 ワード
MySQLデータベースの誤操作後の高速ロールバック方法
転載更新時間:2016年12月09日10:17:22作者:dfcao
この文章は主にMySQLデータベースの誤操作の後で急速にロールバックする方法の関連資料を紹介して、必要な友達は参考にすることができます
基本的には、データベースと付き合っているプログラマー(もちろん同僚かもしれません)は、MySQLが誤操作した後、どのようにして迅速にロールバックするかという問題に直面します.例えば、deleteは1枚の表で、制限条件を忘れて、1枚の表がなくなりました.もしこれがオンライン環境の核心業務データであれば、このことは大きくなります.誤操作後、データをすばやくロールバックできることが重要です.
binlog 2 sqlクイックロールバック
まず、MySQLサーバがbinlogを開いていることを確認し、以下のパラメータを設定します.
?
1 2 3 4 5
binlogをオンにしていないし、ロールバックSQLを事前に生成していないと、本当に速くロールバックできません.重要なビジネスデータを格納するMySQLに対してbinlogを開くことを強くお勧めします.
次に、オープンソースツールbinlog 2 sqlをインストールします.binlog 2 sqlは簡単で使いやすいbinlog解析ツールで、その機能の一つはロールバックSQLを生成することです.
?
1 2
その後、ロールバックSQLを生成できます.
背景:testライブラリfテーブル全体のデータを誤って削除し、緊急ロールバックが必要です.
既存データ
?
1 2 3 4 5 6 7 8 9 10 11 12 13
ロールバック手順:
mysqlにログインし、現在のbinlogファイルを表示
?
1 2 3 4 5 6 7
最新のbinlogファイルはmysql-binです.000002,SQLのbinlog位置を誤操作する
?
1
出力:
?
1 2 3 4
ロールバックsqlを生成し、ロールバックsqlが正しいかどうかを確認します.
?
1
出力:
?
1 2 3 4
ロールバックsqlが正しいことを確認し、ロールバック文を実行します.mysqlにログインし、データのロールバックに成功しました.
?
1 2 3 4 5 6 7 8 9 10
これで首になる心配はない.
よくある質問 DDLが間違って操作したのにどうやって素早くロールバックするのかと聞かれる人がいます.例えばdropは大きな時計を持っています.
なかなかできません.rowモードでもDDL操作では1行あたりのデータの変化がbinlogに記録されないため、DDLはbinlogでロールバックできない.DDLロールバックを実現するには、DDLを実行する前に古いデータをバックアップする必要があります.確かにmysql serverのソースコードを修正することでDDLの高速ロールバックを実現した人がいて、アリのxiaobin linを見つけてpatchを提出しました.しかし、私の知っている限りでは、国内ではこの特性を応用しているインターネット会社は少ない.理由は、最も主要なのは怠け者だと思います.この低周波機能をする必要はありません.副次的な原因は、追加のストレージを増やすことです.
したがって、DDLが誤動作した場合は、バックアップによるリカバリのみが一般的です.もし会社がバックアップも使えなくなったら、本当に航空券を買うことをお勧めします.何してるの?走れ! mysql binlog 2 sqlのほかに、ロールバックツールはありますか?
もちろんあります.アリ彭立勲はmysqlbinlogにflashbackの特性を追加した.これはmysqlが最初に持っていたflashback機能であるはずだ.彭はDMLのロールバックを解決し、binlogを利用してDMLフラッシュバックを行う設計構想を説明した.DDLロールバック特性もアリチームが提案し実現した.この2つの機能には革新的な精神があり、その後現れたフラッシュバックツールは基本的に上の2つの模倣である.また、どこでオープンソースのInceptionはMySQL自動化メンテナンスツールで、これは比較的重いです.DMLロールバックをサポートしています.binlogからロールバックしているわけではありません.バックアップからロールバックしています.DDLロールバックテーブル構造もサポートしています.データはロールバックできません.
転載更新時間:2016年12月09日10:17:22作者:dfcao
この文章は主にMySQLデータベースの誤操作の後で急速にロールバックする方法の関連資料を紹介して、必要な友達は参考にすることができます
基本的には、データベースと付き合っているプログラマー(もちろん同僚かもしれません)は、MySQLが誤操作した後、どのようにして迅速にロールバックするかという問題に直面します.例えば、deleteは1枚の表で、制限条件を忘れて、1枚の表がなくなりました.もしこれがオンライン環境の核心業務データであれば、このことは大きくなります.誤操作後、データをすばやくロールバックできることが重要です.
binlog 2 sqlクイックロールバック
まず、MySQLサーバがbinlogを開いていることを確認し、以下のパラメータを設定します.
?
1 2 3 4 5
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1000M
binlog-format = row
binlogをオンにしていないし、ロールバックSQLを事前に生成していないと、本当に速くロールバックできません.重要なビジネスデータを格納するMySQLに対してbinlogを開くことを強くお勧めします.
次に、オープンソースツールbinlog 2 sqlをインストールします.binlog 2 sqlは簡単で使いやすいbinlog解析ツールで、その機能の一つはロールバックSQLを生成することです.
?
1 2
git clone https://github.com/danfengcao/binlog2sql.git
pip install -r requirements.txt
その後、ロールバックSQLを生成できます.
背景:testライブラリfテーブル全体のデータを誤って削除し、緊急ロールバックが必要です.
既存データ
?
1 2 3 4 5 6 7 8 9 10 11 12 13
mysql>
select
*
from
f;
+
-----+-----+---------------------+
| uid | did | updateTime |
+
-----+-----+---------------------+
| 1 | 18 | 2016-12-06 12:28:18 |
| 2 | 19 | 2016-12-06 12:55:56 |
| 3 | 20 | 2016-12-07 14:00:58 |
| 4 | 21 | 2016-12-07 14:01:00 |
+
-----+-----+---------------------+
mysql>
delete
from
f;Query OK, 4
rows
affected (0.00 sec)
f
mysql>
select
*
from
f;
Empty
set
(0.00 sec)
ロールバック手順:
mysqlにログインし、現在のbinlogファイルを表示
?
1 2 3 4 5 6 7
mysql> show master logs;
+
------------------+-----------+
| Log_name | File_size |
+
------------------+-----------+
| mysql-bin.000001 | 12262268 |
| mysql-bin.000002 | 132776 |
+
------------------+-----------+
最新のbinlogファイルはmysql-binです.000002,SQLのbinlog位置を誤操作する
?
1
$ python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p
'admin'
-dtest -t f
--start-file='mysql-bin.000002'
出力:
?
1 2 3 4
DELETE
FROM
`test`.`f`
WHERE
`did`=18
AND
`updateTime`=
'2016-12-06 12:28:18'
AND
`uid`=1 LIMIT 1; #start 4
end
314
DELETE
FROM
`test`.`f`
WHERE
`did`=19
AND
`updateTime`=
'2016-12-06 12:55:56'
AND
`uid`=2 LIMIT 1; #start 4
end
314
DELETE
FROM
`test`.`f`
WHERE
`did`=20
AND
`updateTime`=
'2016-12-07 14:00:58'
AND
`uid`=3 LIMIT 1; #start 4
end
314
DELETE
FROM
`test`.`f`
WHERE
`did`=21
AND
`updateTime`=
'2016-12-07 14:01:00'
AND
`uid`=4 LIMIT 1; #start 4
end
314
ロールバックsqlを生成し、ロールバックsqlが正しいかどうかを確認します.
?
1
$ python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p
'admin'
-dtest -t f
--start-file='mysql-bin.000002' --start-pos=4 --end-pos=314 -B
出力:
?
1 2 3 4
INSERT
INTO
`test`.`f`(`did`, `updateTime`, `uid`)
VALUES
(21,
'2016-12-07 14:01:00'
, 4); #start 4
end
314
INSERT
INTO
`test`.`f`(`did`, `updateTime`, `uid`)
VALUES
(20,
'2016-12-07 14:00:58'
, 3); #start 4
end
314
INSERT
INTO
`test`.`f`(`did`, `updateTime`, `uid`)
VALUES
(19,
'2016-12-06 12:55:56'
, 2); #start 4
end
314
INSERT
INTO
`test`.`f`(`did`, `updateTime`, `uid`)
VALUES
(18,
'2016-12-06 12:28:18'
, 1); #start 4
end
314
ロールバックsqlが正しいことを確認し、ロールバック文を実行します.mysqlにログインし、データのロールバックに成功しました.
?
1 2 3 4 5 6 7 8 9 10
$ python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p
'admin'
-dtest -t f
--start-file='mysql-bin.000002' --start-pos=4 --end-pos=314 -B | mysql -h127.0.0.1 -P3306 -uadmin -p'admin'
mysql>
select
*
from
f;
+
-----+-----+---------------------+
| uid | did | updateTime |
+
-----+-----+---------------------+
| 1 | 18 | 2016-12-06 12:28:18 |
| 2 | 19 | 2016-12-06 12:55:56 |
| 3 | 20 | 2016-12-07 14:00:58 |
| 4 | 21 | 2016-12-07 14:01:00 |
+
-----+-----+---------------------+
これで首になる心配はない.
よくある質問
なかなかできません.rowモードでもDDL操作では1行あたりのデータの変化がbinlogに記録されないため、DDLはbinlogでロールバックできない.DDLロールバックを実現するには、DDLを実行する前に古いデータをバックアップする必要があります.確かにmysql serverのソースコードを修正することでDDLの高速ロールバックを実現した人がいて、アリのxiaobin linを見つけてpatchを提出しました.しかし、私の知っている限りでは、国内ではこの特性を応用しているインターネット会社は少ない.理由は、最も主要なのは怠け者だと思います.この低周波機能をする必要はありません.副次的な原因は、追加のストレージを増やすことです.
したがって、DDLが誤動作した場合は、バックアップによるリカバリのみが一般的です.もし会社がバックアップも使えなくなったら、本当に航空券を買うことをお勧めします.何してるの?走れ!
もちろんあります.アリ彭立勲はmysqlbinlogにflashbackの特性を追加した.これはmysqlが最初に持っていたflashback機能であるはずだ.彭はDMLのロールバックを解決し、binlogを利用してDMLフラッシュバックを行う設計構想を説明した.DDLロールバック特性もアリチームが提案し実現した.この2つの機能には革新的な精神があり、その後現れたフラッシュバックツールは基本的に上の2つの模倣である.また、どこでオープンソースのInceptionはMySQL自動化メンテナンスツールで、これは比較的重いです.DMLロールバックをサポートしています.binlogからロールバックしているわけではありません.バックアップからロールバックしています.DDLロールバックテーブル構造もサポートしています.データはロールバックできません.