概要
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のクエリが実行されても決してコミットされません。
--------------------
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
--------------------
--- mysqlのコマンドプロンプトから対話形式で実行 ---
> 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件のコメント
記事コメントは受け付けていません。