ラベル mysqlbinlog の投稿を表示しています。 すべての投稿を表示
ラベル mysqlbinlog の投稿を表示しています。 すべての投稿を表示

2019年7月13日土曜日

MySQL Binlogs ::回復するには

だから私は最近出てきたこのような状況の後、私はこれについての投稿をしていないことに気づいた。

シナリオは次のとおりです。バックアップは真夜中に行われ、データベースごとにMySQLダンプを使用しました。 それから翌日の午前10時にデータベースがクラッシュしました。 電話をかける前に一連のイベントが発生しましたが、MyISAMテーブルとIBDファイルがテーブルスペースにないデータベースのバージョンに到達しました。

そのため、オプション1、バックアップから復元すると深夜になり、何時間ものデータを失うことになります。 オプション2、私たちは何千ものibdファイルを再インポートしてすべてを保存します。 それから、オプション3、バックアップからの復元、そして最近の変更にbinlogを適用しました。

それをもっと面白くするために、彼らは私が言われたibdファイルの全てを持っていませんでした、そして私はいくらかの欠けているのを見ました。 それでそれがどのように可能であったかについてよくわからないが、選択肢2は無効な選択肢になった。 彼らは、もちろん、可能な限り少ないデータ損失を望んでいたので、私たちはオプション3を使いました。

これを安全に行うために、ポート3307でMySQLの別のインスタンスを起動しました。これにより、トラフィックがポート3306インスタンスのMyISAMデータへの読み取りアクセスを行っている間も、安全に作業できます。

すべてのバックアップダンプファイルを圧縮解除して3307インスタンスにインポートすると、binlogファイルに集中することができました。

最初は、この概念は実際よりもはるかに危険に思えます。 それは実際にはかなり単純明快です。

だから最初にあなたはあなたの後のデータを見つけなければなりません。 binlogファイルを見直すことで、どのファイルが関連しているのかをすぐに知ることができます。 私の場合、どういうわけか彼らはbinlogをリセットすることができたので117ファイルはその中に2つの日付範囲を持っていました。

最初にbinlogを確認するために、次のコマンドはデータを人間が読める形式で出力します。
mysqlbinlog --defaults-file=/root/.my.cnf --base64-output=DECODE-ROWS --verbose mysql-bin.000117 > review_mysql-bin.000117.sql

*注意...上記のコマンドを実行するときは注意してください。 binlogと同じ場所に直接ファイルをダンプしていることに注意してください。 ファイル名が有効であることを確認してください。 このmysql-bin.000117.sqlは、このmysql-bin.000117 .sqlとは異なります。 あなたは2番目のオプションと.sqlの前のスペースであなたのbinlogを失うでしょう。

適用できるようにデータを保存します。 私はいくつかのbinlogを持っていたので、私はファイルを作成し、とにかく時間範囲を再確認したいと思いました。


mysqlbinlog --defaults-file=/root/.my.cnf --start-datetime="2019-07-09 00:00:00" --stop-datetime="2019-07-10 00:00:00" mysql-bin.000117 > binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf mysql-bin.000118 >> binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf mysql-bin.000119 >> binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf --start-datetime="2019-07-10 00:00:00" --stop-datetime="2019-07-10 10:00:00" mysql-bin.000117 >> binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf --stop-datetime="2019-07-10 10:00:00" mysql-bin.000120 >> binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf --stop-datetime="2019-07-10 10:00:00" mysql-bin.000121 >> binlog_restore.sql

mysql --socket=/var/lib/mysql_restore/mysql.sock -e "source /var/lib/mysql/binlog_restore.sql"

今、私は与えられた時間範囲についてそれらのbinlogからのすべてのデータを適用しました。 クライアントはすべてのデータをダブルチェックし、すべて元に戻すことができてとても嬉しかったです。

この状況にはいくつかの異なる選択肢がありましたが、これはたまたまクライアントと一緒にトレーニングすることでした。

検証されたすべてが復元されたバージョンで大丈夫だったとすれば、両方のデータベースを停止し、データディレクトリを移動し(datadirのデフォルトをそのままにしておきたい)、ディレクトリを安全にしてMySQLを起動します。 復元されたインスタンスはポート3306で起動しました。

2014年11月28日金曜日

mysqlbinlogはポイント·イン·タイム·リカバリの例で失われたMySQLのデータを回復

Original post: http://anothermysqldba.blogspot.com/2014/11/recover-lost-mysql-data-with.html

バックアップ...バックアップ...バックアップ...しかし、もちろん..あなたもそうでない場合、彼らは価値のない可能性があり、多くの場合、それらのバックアップを監視し、テストする必要があります。 MySQLの持つバイナリログは、確かにだけでなく、緊急時にあなたを助けることができる可能にした。 MySQLのバイナリログは、多くの場合、MySQLのレプリケーションに関してで参照され、正当な理由のために、彼らはデータ(変更するクエリまたはイベントをすべて保存し、行ベースが少し異なっているが、この例を)。 それらが提供する回復オプションを検討する際にバイナリログには、サーバーのパフォーマンスへの影響を最小限に抑えています。 


[anothermysqldba]> show variables like 'log_bin%'; 
+---------------------------------+--------------------------------------------+ 
| Variable_name | Value | 
+---------------------------------+--------------------------------------------+ 
| log_bin | ON | 
| log_bin_basename | /var/lib/mysql/binlogs/mysql-binlogs | 
| log_bin_index | /var/lib/mysql/binlogs/mysql-binlogs.index | 

show variables like 'binlog_format%'; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| binlog_format | MIXED | 
+---------------+-------+ 


だから、これはバイナリログからデータを回復し、それをデータベースに戻って適​​用するためにmysqlbinlogはを使用して単純な例です。 

まず、失うために何かを必要とする。 何かが私達のデータベースに起こることだった場合は、我々はデータを回復できるようにする必要がありますまたは多分それはちょうど誰かのミスから回復するための方法です。 


CREATE TABLE `table_w_rdata` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`somedata` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
`moredata` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

私たちはここにふりをし、我々は非常によく、通信および/またはそのコードのコピーを保存していない開発者/ DBAはを持っていると仮定することができます。 


delimiter // 
CREATE PROCEDURE populate_dummydata( IN rowsofdata INT ) 
BEGIN 

SET @A = 3; 
SET @B = 15 - @A; 
SET @C = 16; 
SET @D = 25 - @C; 

WHILE rowsofdata > 0 DO 
INSERT INTO table_w_rdata 
SELECT NULL, SUBSTR(md5(''),FLOOR( @A + (RAND() * @B ))) as somedata, SUBSTR(md5(''),FLOOR( @C + (RAND() * @D ))) AS moredata ; 
SET rowsofdata = rowsofdata - 1; 
END WHILE; 
END// 
delimiter ; 
call populate_dummydata(50); 

> SELECT NOW() \G 
*************************** 1. row *************************** 
NOW(): 2014-11-27 17:32:25 
1 row in set (0.00 sec) 

> SELECT * from table_w_rdata WHERE id > 45; 
+----+----------------------------+------------------+ 
| id | somedata | moredata | 
+----+----------------------------+------------------+ 
| 46 | b204e9800998ecf8427e | 0998ecf8427e | 
| 47 | d98f00b204e9800998ecf8427e | 8ecf8427e | 
| 48 | b204e9800998ecf8427e | 800998ecf8427e | 
| 49 | 98f00b204e9800998ecf8427e | e9800998ecf8427e | 
| 50 | 98f00b204e9800998ecf8427e | 998ecf8427e | 
+----+----------------------------+------------------+ 

1プロシージャが作成されている間、それは後に、他の間違って誰かによって上書きされる。 

DROP PROCEDURE IF EXISTS populate_dummydata ; 
delimiter // 
CREATE PROCEDURE populate_dummydata( IN rowsofdata INT ) 
BEGIN 

SET @A = 3; 
SET @B = 15 - @A; 
SET @C = 16; 
SET @D = 25 - @C; 

WHILE rowsofdata > 0 DO 
INSERT INTO table_w_rdata 
SELECT NULL, SUBSTR(md5(''),FLOOR( @C + (RAND() * @A ))) as somedata, SUBSTR(md5(''),FLOOR( @B + (RAND() * @D ))) AS moredata ; 
SET rowsofdata = rowsofdata - 1; 
END WHILE; 
END// 
delimiter ; 

call populate_dummydata(50); 
> SELECT NOW(); SELECT * from table_w_rdata WHERE id > 95; 
+---------------------+ 
| NOW() | 
+---------------------+ 
| 2014-11-27 17:36:28 | 
+---------------------+ 
1 row in set (0.00 sec) 

+-----+-------------------+---------------------+ 
| id | somedata | moredata | 
+-----+-------------------+---------------------+ 
| 96 | 4e9800998ecf8427e | 00998ecf8427e | 
| 97 | 9800998ecf8427e | 800998ecf8427e | 
| 98 | e9800998ecf8427e | 204e9800998ecf8427e | 
| 99 | e9800998ecf8427e | 4e9800998ecf8427e | 
| 100 | 9800998ecf8427e | 04e9800998ecf8427e | 
+-----+-------------------+---------------------+ 


手続きの置き換えバージョンは思ったチームのようなランダムな値を生成していません。 手続きの元の作成者は、ちょうど欲求不満から終了します。 だから何をするか? それは同様に作成されてから少し時間が過去を持っています。 私たちは私たちのために、データベース名、ルーチン名と誤った手順が作成された一般的な時間枠と幸運を知っているビンログの周りに残っているので、我々はそれを取りに行くことができます。 

私たちはちょうどたいので、周りの一般的な外観を取らなければならないポイント·イン·タイム·リカバリーこのprocedure.Weの手順とその前後バイナリログ内の位置を見つけることが起こる。 


NOW(): 2014-11-27 19:46:17 
# mysqlbinlog --start-datetime=20141127173200 --stop-datetime=20141127173628 --database=anothermysqldba mysql-binlogs.000001 | more 

at 253053 
at 253564 

# mysql anothermysqldba --login-path =local -e "DROP PROCEDURE populate_dummydata"; 
# mysqlbinlog --start-position=253053 --stop-position=253564 --database=anothermysqldba mysql-binlogs.000001 | mysql --login-path =local anothermysqldba 


> SHOW CREATE PROCEDURE populate_dummydata\G 
*************************** 1. row *************************** 
Procedure: populate_dummydata 
sql_mode: NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `populate_dummydata`( IN rowsofdata INT ) 
BEGIN 

SET @A = 3; 
SET @B = 15 - @A; 
SET @C = 16; 
SET @D = 25 - @C; 

WHILE rowsofdata > 0 DO 
INSERT INTO table_w_rdata 
SELECT NULL, SUBSTR(md5(''),FLOOR( @A + (RAND() * @B ))) as somedata, SUBSTR(md5(''),FLOOR( @C + (RAND() * @D ))) AS moredata ; 
SET rowsofdata = rowsofdata - 1; 
END WHILE; 
END 
character_set_client: utf8 
collation_connection: utf8_general_ci 
Database Collation: latin1_swedish_ci 
1 row in set (0.00 sec) 

NOW(): 2014-11-27 19:51:03 
> call populate_dummydata(50); 
> SELECT * from table_w_rdata WHERE id > 145; 
+-----+-----------------------------+------------------+ 
| id | somedata | moredata | 
+-----+-----------------------------+------------------+ 
| 146 | 98f00b204e9800998ecf8427e | 800998ecf8427e | 
| 147 | cd98f00b204e9800998ecf8427e | 800998ecf8427e | 
| 148 | 204e9800998ecf8427e | 98ecf8427e | 
| 149 | d98f00b204e9800998ecf8427e | e9800998ecf8427e | 
| 150 | 204e9800998ecf8427e | 9800998ecf8427e | 
+-----+-----------------------------+------------------+ 


私たちは、経由で、バイナリログから私たちの手順を回復したポイント·イン·タイム·リカバリー 。 
これは単純な例ですが、それはあなたが前進して使用できるツールの例です。 

バイナリログは非常に価値があるのはこのためです。 

参考URL: 

2013年5月7日火曜日

貿易の "ツール"

Original Post: http://anothermysqldba.blogspot.com/2013/04/tools-of-trade.html

私はそれが我々はすべての使用している貿易のトップツールのリストを作成する価値があるかもしれません考え出した。 

まず第一に、これは、これらのツールを作成するのに役立ちますみんなのおかげと言うことです。
第二には、これらを使用していない他の人が見ることができ、これらを使用すると、なぜできるかを学ぶことです。
  • MySQLのコマンドラインクライアント 。
    • これは、私が知っているが、それはMySQLへの最高のアクセスです与えられた。
    • のmysql-P - プロンプト= "\ U @ \ H [\ D]> \ _マスター>"
  • Xtrabackup
    • 。/ xtrabackup - デフォルトファイル=の/ etc / my.cnfファイル - バックアップ - 統計 - ターゲット-DIR =〜/バックアップ/ - 準備 - エクスポート - ユーザ=ルート - innodb_data_home_dir =の/ var / libに/ mysqlの/ - = innodb_data_file_path内の/ var / libに/ mysqlの/
  • mysqlbinlogに
  • mysqltuner
    • あなたのデータベースで何が起こっている可能性に優れた全体図。
  • Perconaツールキット
    • exampes:
      • PT-クエリーダイジェスト
        • 例:PT-クエリダイジェスト - 尋ねる-渡すの/ var / libに/ mysqlの/のmysql-slow.log
      • PT-テーブルチェックサム
        • 例:PT-テーブルチェックサム - 尋ねる-渡す
      • PT-テーブル同期
        • 例:PT-テーブル同期は - no-チェックトリガ - お願い - 合格 - ノーチェックトリガ - 実行 - 印刷
      • PT-ショー助成
        • PT-ショー助成 - 尋ねる-渡す
  • MySQLのユーティリティ
    • exampes:
      • パイソンmysqldiskusage - サーバー=ルート:パスワード@ localhostの
      • パイソンmysqlindexcheck - サーバー=ルート:パスワード@ localhostのps_helper.schema_index_statistics
      • パイソンmysqlprocgrep - サーバー=ルート:パスワード@ localhostの - マッチユーザ=ルート
  • planet.mysql.com
    • これは、一部の人々の質問をするかもしれませんが... 知識は力である。 これはMySQLを学ぶ最良の場所です。
    • あなたは、MySQL DBA候補にインタビューする必要がある場合は、いくつかの一般的なアクティブな作家をピックアップし、彼らはその人が誰であるか知っているかどうか尋ねる。 彼らはMySQLの周りに最新のトレンドや情報を調べたり、それらの経験を持つだけで満足している場合、それはあなたが理解することができるようになります。
  • MySQLのサンドボックス
    • のmytop
      • トップではなく、MySQLのに焦点を当てて触発
    • https://tools.percona.com/
      • これはまた、いくつかの質問をするかもしれない。 それが開始され、デフォルトでインストールされたバージョンよりも優れているmy.cnfファイルを作成するために人々のための迅速かつ便利な方法ですので、私はこれを追加します。 何もない場合、あなたはそれがあるべきと思うものと比較するためにそれを使用することができます。
    あなたは、私は、GUIのファンではないに気づくかもしれません。 使用可能なこれらのGUIツールへの犯罪が、なぜGUIあなたがそれを必要としない場合。 しかし、それはちょうど私の意見です、ここのリストであるGUIツールはただ公平であるように。 すべてのスキーママップは便利ですし、簡単にして行われた後のMySQL Workbenchは 。

    レビューのためのその他のツール: