概要
Windows版のMySQL/MariaDBでは、スクリプトによるサービス停止を行ってオフラインバックアップを行う必要があります。
詳細情報
Windows版のMySQLコマンドでは、--executeオプションがあり、引数を渡してバッチ処理できるようになっています。
しかしコマンド実行後、すぐに [quit] してしまうため、一般的なクエリを実行することはできますが、[flush tables with read lock]コマンドを実行し運用することは出来ません。
検証結果
バッチファイルで下記コマンドを実行
mysql -u root -p<password> -e "flush tables with read lock;"
このコマンドの直後に [quit] してしまい [unlock tables]を実行する前にロックが解除されinsertクエリがコミットされてしまっています。
19 Query flush tables with read lock 19 Quit 13 Query insert into ORDERLIST(ITEM_ID, ORDER_DATE) values (9630, SYSDATE(3)) 13 Query update ORDERCOUNT set ORDER_COUNT = ORDER_COUNT + 1 where ITEM_ID = 9630 13 Query commit 12 Query select * from ITEMLIST where CATEGORY = 97
mysqlのコマンドプロンプトから対話形式で実行
flush tables with read lock コマンドが実行されると insertのクエリが実行されても決してコミットされません。
> flush tables with read lock; 21 Query flush tables with read lock 13 Query select * from ITEMLIST where CATEGORY = 617 : 15 Query select * from ITEMLIST where CATEGORY = 610 10 Query insert into ORDERLIST(ITEM_ID, ORDER_DATE) values (8627, SYSDATE(3)) 12 Query select * from ITEMLIST where CATEGORY = 372 : 13 Query select * from ITEMLIST where CATEGORY = 290 15 Query insert into ORDERLIST(ITEM_ID, ORDER_DATE) values (24, SYSDATE(3)) 9 Query select * from ITEMLIST where CATEGORY = 839
unlock tables コマンドが実行されると即座にアンロックされ、更新クエリがコミットされます。
*ただし順番はランダム。
> unlock tables; 21 Query unlock tables 14 Query update ORDERCOUNT set ORDER_COUNT = ORDER_COUNT + 1 where ITEM_ID = 48046 11 Query update ORDERCOUNT set ORDER_COUNT = ORDER_COUNT + 1 where ITEM_ID = 20164 16 Query update ORDERCOUNT set ORDER_COUNT = ORDER_COUNT + 1 where ITEM_ID = 28458 15 Query update ORDERCOUNT set ORDER_COUNT = ORDER_COUNT + 1 where ITEM_ID = 24 10 Query update ORDERCOUNT set ORDER_COUNT = ORDER_COUNT + 1 where ITEM_ID = 8627 13 Query update ORDERCOUNT set ORDER_COUNT = ORDER_COUNT + 1 where ITEM_ID = 42818 18 Query update ORDERCOUNT set ORDER_COUNT = ORDER_COUNT + 1 where ITEM_ID = 14144 11 Query commit 12 Query update ORDERCOUNT set ORDER_COUNT = ORDER_COUNT + 1 where ITEM_ID = 37162 18 Query commit 15 Query commit 12 Query commit 9 Query update ORDERCOUNT set ORDER_COUNT = ORDER_COUNT + 1 where ITEM_ID = 39381 14 Query commit
よって、バッチファイルから [flush tables with read lock] を実行してオンラインバックアップを行うことはできません。
解決策
サービスを停止/開始するバッチファイルを作成し、設定してください。
・スナップショット前のスクリプトへ下記を設定
-------バッチファイル例------------ @echo off net stop <MySQLのサービス名> if %ERRORLEVEL% neq 0 ( echo “失敗” exit 1 ) else ( echo “成功” ) ---------------------------------------
・スナップショット後のスクリプトへ下記を設定
------バッチファイル例------ @echo off net start <MySQLのサービス名> if %ERRORLEVEL% neq 0 ( echo “失敗” exit 1 ) else ( echo “成功” ) ---------------------------------------
対象製品
- ActiveImage Protector 2016 / 2018 / 2022 Windows版
コメント
0件のコメント
記事コメントは受け付けていません。