24.09.2013 11:48
bujhm1987
 
Как можно реализовать проверку БД после бэкапа?
Самое просто приходит в голову - select 1 from table к каждой таблице и сравнение столбцов в таблице. Как это можно автоматизировать на Windows?
24.09.2013 17:36
OlegON
 
для начала нужно определиться с тем, что именно проверять? Почему именно количество столбцов беспокоит? Почему не --analyze?
25.09.2013 12:03
Onesoft
 
Цитата:
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, но пользуюсь им нечасто, поэтому укручивать лень.
Часовой пояс GMT +3, время: 17:31.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.