| |
К сожалению не всегда можно отловить ошибку на стадии тестирования. Часто они проявляют себя только при реальной нагрузке.
Как вы о них узнаете?
Один из важнейших источников информации о проблемах error log file. Там вы найдёте информацию о таких проблемах как падение сервера, ошибки соединений (если включена опция log_warnings=2), опциях, которые были указаны в конфигурационном файле, но не были включены из-за ошибки и ряде других. Правило работы с error log такое: если творится что-то непонятное, первым делом проверьте записи в error log. Error log file в том числе содержит информацию об ошибках сервера, которые недоступны клиентам. Поэтому желательно его держать всегда включённым даже если у вас включено логирование на уровне приложения.
Приём 25: если творится что-то непонятное, первым делом проверьте записи в error log.
Также вы можете настроить InnoDB Monitor, который будет писать всю информацию об InnoDB транзакцих в error log file.
Приём 26: насторйте InnoDB Monitor чтобы иметь в error log информацию о всех транзакциях с применением InnoDB таблиц.
Другой важный источник информации slow query log. Он содержит все запросы, которые выполняются более чем long_query_time секунд. Дефолтное значение long_query_time 10 секунд, но вы можете его изменить. Используйте slow query log для поиска медленных запросов. Также его можно настроить на запись всех запросов, не использующих индексы.
Приём 27: используйте slow query log чтобы выявить медленные запросы.
После того как ошибка найдена бывает необходимость протестировать её в командной строке. Не всегда это можно сделать на production сервере. Например, если найден запрос, приводящий к падению сервера. Или запрос, выполняющийся очень медленно и теебующий много ресурсов: нужно упростить такой запрос или попробовать не лучше ли его разбить на несколько более простых, так как часто такой приём приводит к улучшению производительности.
В этом случае нужно создать окружение, максимально приближённое к реальному, на тестовой машине.
В общем случае вам нужно запустить на отдельной, например, девелоперской машине, MySQL сервер той же версии, что и на рабочем сервере. Также вам нужно скопировать настройки из конфигурационного файла и загрузить данные. Проще всего сделать дамп при помощи команды mysqldump, но это не всегда удобно, так как может занять слишком много времени при большом объёме данных. MySQL поддерживает бинарную совместимость данных между платформами, поэтому можно просто скопировать файлы нужных таблиц. Смотрите приложение о способах backup и переноса данных между MySQL серверами.
После того, как копия рабочего сервера была создана, вы можете тестировать не опасаясь последствий для приложения.
Иногда нужно протестировать запрос на разных версиях. Это может понадобиться, если вы столкнулись с багом в MySQL коде, который был исправлен позднее, и хотите проверить, будут ли остальные запросы вашего приложения равботать на этой новой версии. Это может быть не обязательно баг, но новая возможность.
Иногда стоит протестировать несколько минорных версий, чтобы выбрать наиболее для вас подходящую.
Проще всего это сделать при помощи MySQL Sandbox. MySQL Sandbox это кросс-платформенное приложение, написанное на Perl. Загрузить его можно с https://launchpad.net/mysql-sandbox
Загрузите *tar.gz пакет с нужной вам версией, затем установите MySQL Sandbox и запустите команду:
$make_sandbox mysql-5.4.2-beta-linux-x86_64-glibc23.tar.gz
unpacking /users/ssmirnova/blade12/mysql-5.4.2-beta-linux-x86_64-glibc23.tar.gz
Executing low_level_make_sandbox --basedir=/users/ssmirnova/blade12/5.4.2 \
--sandbox_directory=msb_5_4_2 \
--install_version=5.4 \
--sandbox_port=5420 \
--no_ver_after_name \
--my_clause=log-error=msandbox.err
The MySQL Sandbox, version 3.0.05
(C) 2006,2007,2008,2009 Giuseppe Maxia
installing with the following parameters:
upper_directory = /users/ssmirnova/sandboxes
sandbox_directory = msb_5_4_2
sandbox_port = 5420
check_port = 0
no_check_port = 0
datadir_from = script
install_version = 5.4
basedir = /users/ssmirnova/blade12/5.4.2
my_file =
operating_system_user = ssmirnova
db_user = msandbox
db_password = msandbox
my_clause = log-error=msandbox.err
prompt_prefix = mysql
prompt_body = [\h] {\u} (\d) > '
force = 0
no_ver_after_name = 1
verbose = 0
load_grants = 1
no_load_grants = 0
no_run = 0
no_show = 0
do you agree? ([Y],n) Y
091101 11:47:44 [Warning] Forcing shutdown of 2 plugins
091101 11:47:44 [Warning] Forcing shutdown of 2 plugins
loading grants
........ sandbox server started
Your sandbox server was installed in $HOME/sandboxes/msb_5_4_2
Замените mysql-5.4.2-beta-linux-x86_64-glibc23.tar.gz нужной вам версией.
Выше вы увидели, что sandbox server был инсталлирован в директории $HOME/sandboxes/msb_5_4_2. Также он был запущен:
$cd $HOME/sandboxes/msb_5_4_2
$./my
syntax my sql{dump|binlog|admin} arguments
$./my sql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.4.2-beta MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql [localhost] {msandbox} ((none)) > select version();
+------------+
| version() |
+------------+
| 5.4.2-beta |
+------------+
1 row in set (0.00 sec)
mysql [localhost] {msandbox} ((none)) > \q
Bye
Остановите сервер при помощи команды
$./stop
Внесите необходимые изменения в конфигурационный файл, скопируйте данные, затем запустите сервер:
$./start
. sandbox server started
Песочница ( а sandbox переводится с английского как песочница) готова! Можете начинать тестировать.
Приём 28: используйте MySQL Sandbox, чтобы быстро и удобно оттестировать ваше приложение на нескольких версиях MySQL.
Не всегда удобно выявлять ошибку, используя все данные. Например, вы получаете неверный результат, запрашивая несколько строк из таблицы с миллионами строк. Если по каким-либо причинам этот запрос выполняется медленно вы будете достаточно долго ждать результата каждого из тестовых запросов.
Чаще всего неверные результаты возникают при использовании предиката WHERE в совокупности с другими предикатами, такими как LIMIT, ORDER BY, GROUP BY, HAVING или же если в WHERE содержится несколько условий.
Вы можете минимизировать test case используя только часть данных.
Создайте таблицу с теми же полями, что и исходная:
CREATE TABLE test_problem LIKE problem;
Затем загрузите в эту таблицу только часть данных:
INSERT INTO test_problem SELECT FROM problem WHERE [условие, которое присутствует в оригинальном запросе, но выполняется верно]
Далее работайте с таблицей test_problem до тех пор, пока не найдёте причину неправильного поведения. Исправьте оригинальный запрос.
Тот же приём можно применять и для запросов, одновременно использующих несколько таблиц.
Приём 29: используйте часть данных при работе с запросами, которые возвращают неверные результаты на больших объёмах.
Назад | Содержание | Вперёд |
Автор 2009 Света Смирнова COPYRIGHT © 2009 С.Смирнова и С.Ласунов sveta_гав_js-client_точка_com |
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |