После некоторых проблем со строками UTF8 и без UTF8 мы стандартизируем UTF8. Одна вещь, которую мне нужно сделать, это проверить, что все в базе данных MySQL находится в UTF8? Что мне нужно проверить?
Я думал поместить все это в плагин nagios, чтобы проверить, все ли в UTF8. Предложения?
Рори, Во-первых, вы правы, желая отслеживать то, что создается в ваших базах данных. Хотя мы все предпринимаем шаги для предотвращения ошибок, вы не можете предполагать, что ошибки не закроются. Я делаю очень похожую вещь, поскольку большая часть нашей инфраструктуры требует UTF8.
Следующие запросы подходят для проверки статистики:
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, COUNT(0) AS COUNT FROM information_schema.SCHEMATA GROUP BY DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME;
# to filter schema use SCHEMA_NAME in the where clause
SELECT TABLE_COLLATION, COUNT(0) AS COUNT FROM information_schema.TABLES WHERE TABLE_COLLATION IS NOT NULL GROUP BY TABLE_COLLATION;
# to filter schema use TABLE_SCHEMA in the where clause
SELECT CHARACTER_SET_NAME, COLLATION_NAME, COUNT(0) AS COUNT FROM information_schema.COLUMNS WHERE CHARACTER_SET_NAME IS NOT NULL AND COLLATION_NAME IS NOT NULL GROUP BY CHARACTER_SET_NAME, COLLATION_NAME;
# to filter schema use TABLE_SCHEMA in the where clause
Следующие запросы были бы хороши для задания cron, которое отправит вам электронное письмо, если будут найдены какие-либо результаты:
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE DEFAULT_CHARACTER_SET_NAME NOT LIKE '%utf8%' OR DEFAULT_COLLATION_NAME NOT LIKE '%utf8%';
# to filter schema use SCHEMA_NAME in the where clause
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_COLLATION IS NOT NULL AND TABLE_COLLATION NOT LIKE '%utf8%';
# to filter schema use TABLE_SCHEMA in the where clause
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE CHARACTER_SET_NAME NOT LIKE '%utf8%' OR COLLATION_NAME NOT LIKE '%utf8%';
# to filter schema use TABLE_SCHEMA in the where clause
Эти запросы работают для MySQL> = 5.0. Если вам нужна помощь в написании задания cron, дайте мне знать.
У меня также есть проблема с моими разработчиками (в основном командой Ruby on Rails), создающими таблицы InnoDB, когда они им не нужны. Чтобы сохранить это в секрете, я отслеживаю промежуточную базу данных с помощью cron, который вызывает:
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE ENGINE = 'InnoDB';
Jure1873 предлагает использовать grep, и я заметил, что awk более подходит. Вот что я собрал.
mysqldump --all-databases --no-data | awk '{gsub("[`;]","");};/^USE /{db=$2;};/CREATE TABLE /{table=$3;};/^\) ENGINE/{sub(".*CHARSET=","");if(!match($1,"utf8")){print db ":" table ":" $1;}}'
Вот оно с повышенной удобочитаемостью:
mysqldump --all-databases --no-data | \
awk '
{
gsub("[`;]","");
};
/^USE /{
db=$2;
}; \
/CREATE TABLE /{
table=$3;
}; \
/^\) ENGINE/{
sub(".*CHARSET=","");
if(!match($1,"utf8")){
print db ":" table ":" $1;
}
}
'
Я бы сделал что-нибудь вроде mysqldump --all-databases --no-data | grep -i символ
dbs=$(echo 'show databases;' | mysql | grep -v '^Database$' | tr "\n" " ")
for d in ${dbs}; do
tables=$(echo 'show tables' | mysql $d | grep -v '^Tables' | tr "\n" " ")
for t in ${tables}; do
echo "**************** DB ${d} TABLE ${t}"
mysqldump --no-data ${d} ${t} | grep COLLATE | grep -v utf && echo "DB ${d} TABLE ${t} !!!!"
mysqldump --no-data ${d} ${t} | grep CHARSET | grep -v utf && echo "DB ${d} TABLE ${t} !!!!"
done
done
Nagios - действительно неподходящий инструмент для этого. Nagios больше предназначен для мониторинга служб, а не проверки конфигурации неправильно. Лучшим инструментом будет какой-то инструмент управления конфигурацией, такой как puppet или cfengine, чтобы убедиться, что файлы конфигурации имеют правильные настройки.
Что касается собственно конфигурации, руководство MySQL имеет очень исчерпывающий глава о наборах символов и кодировке.