[ОТВЕТИТЬ]
Опции темы
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, но пользуюсь им нечасто, поэтому укручивать лень.
 
"Спасибо" Onesoft от:
 
Опции темы



Часовой пояс GMT +3, время: 01:04.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.