Цитата: bujhm1987 ➤ Как можно реализовать проверку БД после бэкапа?
Самое просто приходит в голову - select 1 from table к каждой таблице и сравнение столбцов в таблице. Как это можно автоматизировать на Windows?
Самый надёжный способ - проверка контрольных сумм потаблично при помощи команды CHECKSUM TABLE <table_name>. Два условия:
1. бэкап БД надо развернуть на другом сервере (или на другом порту) и запустить;
2. на весь период "бэкапирование - разворачивание быкапа - проверка контрольных сумм" исключить любую модификацию данных в обеих БД, например, остановив все пишушие в БД сервисы (апач, укмсервис, импорт/экспорт и т.п.), а для пущей уверенности в обеих БД выполнив:
FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;
и по окончании проверки вернув:
SET GLOBAL read_only = OFF;
UNLOCK TABLES;
Автоматизировать процесс проверки контрольных сумм можно при помощи скрипта.cmd, например:
Код:
@Echo Off
SET DBADDR1=ukm_server
SET DBADDR2=backup_server
SET DBUSER=superuser
SET DBPASS=megapassword
Setlocal enabledelayedexpansion
Echo>"%~dp0checksum_check_result.txt" Database Table Checksum on %DBADDR1% Table Checksum on %DBADDR2%
For /F "Skip=1 Tokens=1,2 Delims= " %%a In ('C:\MySQL\bin\mysql.exe -u%DBUSER% -p%DBPASS% -h%DBADDR1% --table^=false -e"select TABLE_SCHEMA,TABLE_NAME from information_schema.tables where TABLE_SCHEMA NOT IN('repformance_schema','information_schema','mysql')"') Do (
SET DB1=
SET DB2=
For /F "Tokens=2 Delims= " %%c In ('C:\MySQL\bin\mysql.exe -u%DBUSER% -p%DBPASS% -h%DBADDR1% -D%%~a --skip-column-names --table^=false -e"CHECKSUM TABLE %%~b"') Do (
Set DB1=%%~c
)
For /F "Tokens=2 Delims= " %%c In ('C:\MySQL\bin\mysql.exe -u%DBUSER% -p%DBPASS% -h%DBADDR2% -D%%~a --skip-column-names --table^=false -e"CHECKSUM TABLE %%~b"') Do (
Set DB2=%%~c
)
If "!DB1!"=="!DB2!" (
Set Conclusion=MATCH
) Else (
Set Conclusion=NOT_MATCH
)
Echo>>"%~dp0checksum_check_result.txt" %%~a %%~b !DB1! !DB2! !Conclusion!
Echo %%~a %%~b !DB1! !DB2! !Conclusion!
)
Endlocal
pause
В параметре Delims циклов For содержится два символа: символ горизонтальной табуляции (который TAB он же \t он же 09h) и пробел.
Работает скрипт долго, особенно если большая история продаж - на таблицах trm_out_* висит особенно долго. Ну и в один поток (для распараллеливания процедуры подсчёта контрольных сумм нужен более другой скрипт). В процессе работы формируется итоговый файл по всем несоответствиям контрольных сумм.
Мною этот скрипт был написан для проверки целостности данных в связке репликации серверов MySQL, но пользуюсь им нечасто, поэтому укручивать лень.