Значение | Объяснение | Примечание |
0 | OFF | Не кэширует и не извлекает результаты. |
1 | ON | Кэширует все результаты, кроме запросов SELECT SQL_NO_CACHE .... |
2 | DEMAND | Кэширует только запросы SELECT SQL_CACHE .... |
safe_show_database
Не отображаются базы данных, для которых у пользователя нет каких-либо привилегий по базам данных или таблицам. Таким образом можно увеличить степень безопасности, если вы не хотите предоставлять посторонним лицам возможность получать информацию о том, какие базы данных есть у других пользователей. Также см. skip_show_database.
server_id
Значение параметра --server-id.
skip_locking
Установлено в значение OFF, если mysqld использует внешнюю блокировку.
skip_networking
Установлено в значение ON, если разрешаются только локальные соединения (через сокет).
skip_show_database
Эта переменная не позволяет выполнять команду SHOW DATABASES, если у пользователя нет привилегии PROCESS. Таким образом можно увеличить степень безопасности, если вы не хотите предоставлять посторонним лицам возможность получать информацию о том, какие базы данных есть у других пользователей. Также см. safe_show_database.
slave_net_timeout
Количество времени в секундах, в течение которого ожидаются дополнительные данные от подсоединенного головного или подчиненного компьютера прежде, чем будет отменено чтение.
slow_launch_time
Если создание потока занимает больше, чем указанное значение (в секундах), значение счетчика Slow_launch_threads будет увеличено.
socket
Сокет Unix, используемый сервером.
sort_buffer_size
Каждый поток, которому необходимо произвести сортировку, выделяет буфер данного размера. Увеличение данного значения позволит ускорить выполнение операторов ORDER BY или GROUP BY. See section A.4.4 Где MySQL хранит временные файлы.
table_cache
Количество открытых таблиц для всех потоков. С увеличением этого значения увеличивается количество дескрипторов файлов, необходимых для mysqld. Чтобы узнать, необходимо ли изменять значение кэша таблиц, следует проверить значение переменной Opened_tables. См. раздел See section A.4.4 Где MySQL хранит временные файлы. Если у этой переменной большое значение, а команда FLUSH TABLES (которая закрывает все таблицы, а потом открывает их повторно) используется не часто, то необходимо увеличить ее значение. Чтобы получить дополнительную информацию по кэшу таблиц, см. раздел See section 5.4.7 Открытие и закрытие таблиц в MySQL.
table_type
Принятый по умолчанию тип таблиц.
thread_cache_size
Определяет, сколько потоков должно сохраняться в кэше для повторного использования. После отключения клиента потоки клиента помещаются в кэш, если там не больше потоков, чем thread_cache_size. Все новые потоки сначала берутся из кэша, и только когда кэш становится пустым, создаются новые потоки. Значение этой переменной можно увеличить, чтобы повысить производительность, если создается много новых соединений (если потоки у вас хорошо организованы, обычно заметного улучшения производительности не наблюдается). Насколько эффективен текущий кэш потоков, можно определить по разнице между Connections и Threads_created.
thread_concurrency
В системе Solaris mysqld вызывает функцию thr_setconcurrency() с этим значением. thr_setconcurrency() позволяет приложению дать системе потоков подсказку по необходимому количеству потоков, которые должны быть запущены в одно и то же время.
thread_stack
Размер стека для каждого потока. От данного значения зависит большое количество ограничений, обнаруживаемых при помощи теста crash-me. По умолчанию этот размер достаточен для нормальной работы. See section 5.1.4 Набор тестов MySQL (The MySQL Benchmark Suite).
timezone
Часовой пояс, в котором находится сервер.
tmp_table_size
Если находящаяся в памяти временная таблица превысит этот размер, MySQL автоматически преобразует ее в дисковую таблицу MyISAM. Значение tmp_table_size следует увеличить, если выполняется много расширенных запросов GROUP BY и в вашей системе установлено значительное количество оперативной памяти.
tmpdir
Каталог, используемый для временных файлов и временных таблиц. Начиная с MySQL 4.1, в tmpdir могут быть указаны несколько путей, разделенных двоеточием : (точкой с запятой на Windows ;). Эти пути будут использованы в ротации.
version
Номер версии сервера.
wait_timeout
Время в секундах, на протяжении которого сервер наблюдает неактивность в неинтерактивном соединения прежде, чем закрыть его. Когда запускается поток, SESSION.WAIT_TIMEOUT инициализируется исходя из GLOBAL.WAIT_TIMEOUT или GLOBAL.INTERACTIVE_TIMEOUT, в зависимости от типа клиента (как определяется в CLIENT_INTERACTIVE опции соединения).
См. также interactive_timeout.
Раздел руководства, в котором описывается настройка MySQL содержит некоторую информацию по настройке приведенных выше переменных. See section 5.5.2 Настройка параметров сервера.
SHOW LOGS
SHOW LOGS отображает информацию по состоянию существующих файлов журналов. На данный момент выводится информация только по файлам журналов Berkeley DB.
File отображает полный путь к файлу журнала
Type отображает тип файла журнала (BDB для файлов журналов Berkeley
DB) Status отображает состояние файла журнала (FREE - если файл может быть
удален, или IN USE, если файл необходим подсистеме транзакций).
SHOW PROCESSLIST
Команда SHOW [FULL] PROCESSLIST показывает, какие потоки запущены в настоящий момент. Эту информацию также можно получить при помощи команды mysqladmin processlist. Если у вас привилегия SUPER, можно просматривать все потоки, в противном случае - только свои потоки. See section 4.5.5 Синтаксис команды KILL. Если не используется параметр FULL, будут показаны только первые 100 символов каждого запроса.
Начиная с 4.0.12, MySQL сообщает имя хоста для TCP/IP соединений как имя_хоста:клиентский_порт с тем, чтобы было проще понять, какой клиент чем занят.
Эта команда очень полезна, если выдается сообщение об ошибке 'too many connections' (слишком много соединений) и необходимо выяснить, что происходит. MySQL резервирует одно дополнительное соединение для клиента с привилегией SUPER, чтобы у вас всегда была возможность войти в систему и произвести проверку (предполагается, что вы не станете раздавать эту привилегию всем своим пользователям).
Некоторые состояния обычно можно увидеть в mysqladmin processlist.
Checking table
Поток осуществляет [автоматическую] проверку таблицы. Closing tables
Означает, что поток записывает измененные данные таблиц на диск и закрывает использующиеся таблицы. Выполнение этой операции должно произойти быстро. Если на нее уходит значительное время, убедитесь, что диск не переполнен или что диск не используется слишком интенсивно. Connect Out
Подчиненный компьютер, подсоединенный к головному компьютеру. Copying to tmp table on disk
Набор временных результатов превысил tmp_table_size, и теперь поток изменяет таблицу временных данных, расположенную в памяти, на дисковую таблицу, чтобы сохранить память. Creating tmp table
Поток создает временную таблицу, чтобы хранить часть результатов для запроса. deleting from main table
При запуске первой части удаления нескольких таблиц удаление производится только начиная с первой таблицы. deleting from reference tables
При запуске второй части удаления нескольких таблиц удаляются совпадающие строки из других таблиц. Flushing tables
Поток запускает команду FLUSH TABLES и ожидает, пока все потоки закроют свои таблицы. Killed
Кто-то направил команду на закрытие потока, и поток будет закрыт при следующей проверке флага закрытия. Флаг проверяется при каждом основном цикле в MySQL, но в некоторых случаях закрытие потока может занять некоторое время. Если поток заблокирован другим потоком, закрытие будет произведено сразу после того, как другой поток снимет блокировку. Sending data
Поток обрабатывает строки для оператора SELECT, а также направляет данные клиенту. Sorting for group
Поток осуществляет сортировку в соответствии с GROUP BY. Sorting for order
Поток осуществляет сортировку в соответствии с ORDER BY. Opening tables
Это просто означает, что поток пытается открыть таблицу. Такая процедура осуществляется довольно быстро, если что-либо не мешает открытию. Например, команды ALTER TABLE или LOCK TABLE могут помешать открытию таблицы, пока выполнение команды не будет завершено. Removing duplicates
Запрос использовал команду SELECT DISTINCT таким образом, что MySQL не смог произвести оптимизацию на начальном этапе. Поэтому MySQL перед отправкой результатов клиенту должен выполнить дополнительное удаление всех дублирующихся строк. Reopen table
Поток заблокировал таблицу, но обнаружил, что после блокировки структура таблицы изменилась. Он снял блокировку, закрыл таблицу и теперь пытается повторно ее открыть. Repair by sorting
Код восстановления использует сортировку для создания индексов. Repair with keycache
Код восстановления использует создание ключей один за другим, через кэш ключей. Это намного медленнее, чем Repair by sorting. Searching rows for update
Поток осуществляет первую фазу - производит поиск всех совпадающих строк, чтобы затем обновить их. Это действие необходимо выполнить, если команда UPDATE изменяет индекс, который используется для поиска указанных строк. Sleeping
Поток ожидает, когда клиент направит ему новую команду. System lock
Поток ожидает получения внешней системной блокировки таблицы. Если не используется несколько серверов mysqld, которые получают доступ к одним и тем же таблицам, системную блокировку можно отключить при помощи параметра --skip-external-locking. Upgrading lock
Обработчик INSERT DELAYED пытается заблокировать таблицу, чтобы вставить строки. Updating
Поток производит поиск строк, которые необходимо обновить, и обновляет их. User Lock
Поток ожидает GET_LOCK(). Waiting for tables
Поток получил уведомление, что структура таблицы изменилась, и ему необходимо повторно открыть таблицу, чтобы получить новую структуру. Чтобы повторно открыть таблицу, он должен подождать, пока ее не закроют все остальные потоки. Это уведомление выдается, если другой поток воспользовался командой FLUSH TABLES или к таблице была применена одна из следующих команд: FLUSH TABLES table_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE или OPTIMIZE TABLE. Обработчик INSERT DELAYED завершил работу со всеми вставками и ожидает новые.
Большинство состояний - это очень быстрые операции. Если потоки остаются в любом из этих состояний на протяжении большого количества секунд, то, возможно, возникла какая-то проблема, которую следует устранить.
Существует еще несколько состояний, не упомянутых выше, но большинство из них полезны только для поиска ошибок в mysqld.
SHOW GRANTS
SHOW GRANTS FOR user выводит список команд назначения привилегий, которые нужны при дублировании привилегий для пользователя.
mysql> SHOW GRANTS FOR root@localhost; +---------------------------------------------------------------------+ | Grants for root@localhost | +---------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root''localhost' WITH GRANT OPTION | +---------------------------------------------------------------------+
Для получения информации по привилегии в текущей сессии можно использовать функцию CURRENT_USER() (новшество в версии 4.0.6) для того, чтобы выяснить, по какому пользователю в действительности аутентифицировалась сессия. See section 6.3.6.2 Разные функции.
SHOW CREATE TABLE
Показывает оператор CREATE TABLE, который будет создавать данную таблицу:
mysql> SHOW CREATE TABLE t\G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE t ( id int(11) default NULL auto_increment, s char(60) default NULL, PRIMARY KEY (id) ) TYPE=MyISAM
Команда SHOW CREATE TABLE будет выдавать таблицу и названия столбцов в соответствии с параметром SQL_QUOTE_SHOW_CREATE. See section 5.5.6 Синтаксис команды SET.
SHOW WARNINGS | ERRORS
SHOW WARNINGS [LIMIT #] SHOW ERRORS [LIMIT #]
Эта команда реализована в версии MySQL 4.1.0.
Команда показывает информацию по ошибкам, предупреждениям и сообщениям, касающихся последней команды. Эти сообщения сбрасываются для каждой новой команды, использующей таблицы.
Сервер MySQL возвращает общее количество сообщений и ошибок, которые вы получили для последней команды. Это количество можно получить вызовом mysql_warning_count().
Максимум max_error_count сообщений сохраняется (переменная глобальная и специфичная для потока).
Вы можете получить количество ошибок из @error_count и количество предупреждений из @warning_count.
SHOW WARNINGS сообщает все ошибки, предупреждения и заметки, которые вы получили для последней команды, в то время как SHOW ERRORS даешь лишь только информацию по ошибкам.
mysql> DROP TABLE IF EXISTS нет_такой_таблицы; mysql> SHOW WARNINGS;
+-------+------+-----------------------------------+ | Level | Code | Message | +-------+------+-----------------------------------+ | Note | 1051 | Unknown table 'нет_такой_таблицы' | +-------+------+-----------------------------------+
SHOW TABLE TYPES
SHOW TABLE TYPES
Эта команда реализована в 4.1.0.
SHOW TABLE TYPES дает статусную информацию про типы таблиц. Эта информация полезна, например, для проверки, поддерживается ли определенный тип таблицы или для того чтобы узнать, какой тип таблиц используется по умолчанию.
mysql> SHOW TABLE TYPES;
+--------+---------+----------------------------------------------------------------+ | Type | Support | Comment | +--------+---------+----------------------------------------------------------------+ | MyISAM | DEFAULT | Основной тип для 3.23 с отличной производительностью | | HEAP | YES | Хеш-тип, хранится только в памяти, полезен для временных таблиц| | MERGE | YES | Набор идентичных MyISAM-таблиц | | ISAM | YES | Старый тип; замещен MyISAM | | InnoDB | YES | Поддерживает транзакции, строчную блокировку и внешние ключи | | BDB | NO | Поддерживает транзакции и страничную блокировку | +--------+---------+----------------------------------------------------------------+ 6 rows in set (0.00 sec)
Опция DEFAULT в столбце Support указывает, что данный конкретный тип таблицы поддерживается и является принятым по умолчанию. Если сервер был запущен с --default-table-type=InnoDB, тогда для InnoDB столбец Support примет значение DEFAULT.
SHOW PRIVILEGES
SHOW PRIVILEGES
Эта команда реализована в MySQL 4.1.0.
SHOW PRIVILEGES показывает список системных привилегий, которые поддерживаются сервером MySQL.
mysql> show privileges; +------------+--------------------------+-------------------------------------------------------+ | Privilege | Context | Comment | +------------+--------------------------+-------------------------------------------------------+ | Select | Tables | To retrieve rows from table | | Insert | Tables | To insert data into tables | | Update | Tables | To update existing rows | | Delete | Tables | To delete existing rows | | Index | Tables | To create or drop indexes | | Alter | Tables | To alter the table | | Create | Databases,Tables,Indexes | To create new databases and tables | | Drop | Databases,Tables | To drop databases and tables | | Grant | Databases,Tables | To give to other users those privileges you possess | | References | Databases,Tables | To have references on tables | | Reload | Server Admin | To reload or refresh tables, logs and privileges | | Shutdown | Server Admin | To shutdown the server | | Process | Server Admin | To view the plain text of currently executing queries | | File | File access on server | To read and write files on the server | +------------+--------------------------+-------------------------------------------------------+ 14 rows in set (0.00 sec)
Этот же пример в переводе на русский язык:
mysql> show privileges; +------------+--------------------------+-------------------------------------------------------+ | Привилегия | Контекст | Описание | +------------+--------------------------+-------------------------------------------------------+ | Select | Таблица | Для выборки строк из таблицы | | Insert | Таблица | Для вставки данных в таблицы | | Update | Таблица | Для обновления существующих записей | | Delete | Таблица | Для удаления существующих записей | | Index | Таблица | Для создания или удаления индексов | | Alter | Таблица | Для изменения таблиц | | Create | База,Таблица,Индекс | Для создания новых баз данных и таблиц | | Drop | База,Таблица | Для удаления баз данных и таблиц | | Grant | База,Таблица | Для раздачи другим пользователям имеющихся у вас прав | | References | База,Таблица | Для обладания ссылок на таблицы | | Reload | Администрирование | Для обновления таблиц, журналов и привилегий | | Shutdown | Администрирование | Для остановки сервера | | Process | Администрирование | Для просмотра текста выполняющихся запросов | | File | Доступ к файлам | Для чтения и записи файлов на сервере | +------------+--------------------------+-------------------------------------------------------+ 14 rows in set (0.00 sec)
Синтаксис команды SHOW
SHOW DATABASES [LIKE wild] или SHOW [OPEN] TABLES [FROM db_name] [LIKE wild] или SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE wild] или SHOW INDEX FROM tbl_name [FROM db_name] или SHOW TABLE STATUS [FROM db_name] [LIKE wild] или SHOW STATUS [LIKE wild] или SHOW VARIABLES [LIKE wild] или SHOW LOGS или SHOW [FULL] PROCESSLIST или SHOW GRANTS FOR user или SHOW CREATE TABLE table_name или SHOW MASTER STATUS или SHOW MASTER LOGS или SHOW SLAVE STATUS или SHOW WARNINGS [LIMIT #] или SHOW ERRORS [LIMIT #] или SHOW TABLE TYPES
Команда SHOW предоставляет информацию по базам данных, таблицам, столбцам или о состоянии сервера. Если используется LIKE wild, то строка wild может содержать в себе шаблонные символы SQL `%' и `_'.
Набор символов немецкого алфавита
Для задания порядка сортировки в соответствии с немецким алфавитом нужно запустить mysqld с параметром --default-character-set=latin1_de.
При сортировке и сравнении строк осуществляется следующая подстановка:
Д -> ae Ж -> oe Э -> ue ъ -> ss
Все символы с диакритическими знаками заменяются их аналогами из верхнего регистра и без ударения. Все буквы переводятся в верхний регистр.
При сравнении строк с помощью команды LIKE, подстановки двух символов вместо одного не происходит. Все буквы переводятся в верхний регистр. Диакритические знаки снимаются со всех букв, кроме: э, Э, ж, Ж, д и Д.
Набор символов, применяющийся для записи данных и сортировки
По умолчанию в MySQL используется набор символов ISO-8859-1 (Latin1) с сортировкой согласно шведским/финским правилам. Этот набор символов также подходит для использования в США и Западной Европе.
Все стандартные исполняемые файлы MySQL компилируются с настройкой --with-extra-charsets=complex. Таким образом в файл помещается код, позволяющий всем стандартным программам работать с набором символов latin1, а также многобайтовыми наборами символов. Другие наборы символов могут загружаться из соответствующих файлов определений по необходимости.
Набор определяет, какие символы могут использоваться в именах, а также способ сортировки значений в операторах ORDER BY и GROUP BY команды SELECT.
При запуске сервера можно изменить набор символов при помощи параметра --default-character-set. Выбрать доступные наборы символов можно при помощи параметров --with-charset=charset и --with-extra-charsets= список-кодировок | complex | all, и файлов наборов символов, перечисленных в SHAREDIR/charsets/Index. See section 2.3.3 Типичные опции configure.
При смене набора символов во время работы MySQL (что может одновременно изменить и порядок сортировки) необходимо запустить команду myisamchk -r -q --set-character-set=charset для всех таблиц. В противном случае индексы могут быть созданы в неправильном порядке.
При подключении клиента к серверу MySQL сервер отправляет ему используемый по умолчанию набор символов. На время соединения клиент переключается на использование этого набора.
Для экранирования строк в SQL-запросе необходимо пользоваться функцией mysql_real_escape_string(). mysql_real_escape_string() идентична старой функции mysql_escape_string() - во всем, кроме одного: в качестве первого параметра она принимает дескриптор соединения MYSQL.
Если клиент был скомпилирован с набором путей, в которых не было пути установки сервера, а настраивавший MySQL пользователь на включил в исполняемый файл системы все наборы символов, клиенту необходимо сообщить о местонахождении дополнительных наборов символов, которые нужны ему для общения с сервером.
Сделать это можно путем внесения в файл настроек MySQL следующей строки:
[client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
путь в ней указывает на каталог, в котором хранятся динамические наборы символов MySQL.
Заставить клиента использовать определенный набор символов можно следующим образом:
[client] default-character-set=character-set-name
но обычно этого не требуется.
Сообщения об ошибках на языках, отличных от английского
mysqld может выдавать сообщения об ошибках на следующих языках: чешском, датском, голландском, английском (по умолчанию), эстонском, французском, немецком, греческом, венгерском, итальянском, японском, корейском, норвежском, новонорвежском, польском, португальском, румынском, русском, словацком, испанском и шведском.
При запуске mysqld выбрать определенный язык можно при помощи настройки --language=язык или -L язык. Например:
shell> mysqld --language=swedish или: shell> mysqld --language=/usr/local/share/swedish
Обратите внимание: названия языков вводятся в нижнем регистре.
Файлы языков по умолчанию располагаются в папке `mysql_base_dir/share/LANGUAGE/'.
Для того чтобы изменить тексты сообщений об ошибках, нужно отредактировать файл `errmsg.txt' и запустить следующую команду для генерации нового файла `errmsg.sys':
shell> comp_err errmsg.txt errmsg.sys
Установив новую версию MySQL, не забудьте внести те же изменения в новый файл `errmsg.txt'.
Добавление набора символов
Снабдить MySQL новым набором символов можно следующим образом.
Определите, является ли новый набор символов простым или сложным. Если для работы с этим набором никаких специальных процедур обработки строк и поддержки многобайтовых символов не требуется, он является простым. Если вышеперечисленные возможности необходимы, этот набор символов относится к сложным.
Например, наборы latin1 и danish - простые, а big5 и czech - сложные.
Для всех приведенных ниже примеров предполагается, что используемый набор символов называется MYSET.
Для создания простого набора достаточно сделать следующее:
Вставьте имя MYSET в конец файла `sql/share/charsets/Index' и присвойте этому набору символов уникальный номер.
Создайте файл `sql/share/charsets/MYSET.conf'. (в качестве основы можно использовать файл `sql/share/charsets/latin1.conf'). Правила составления этого файла очень просты:
Комментарием считается целая строка, начинающаяся с символа `#'.
Слова разделяются любым количеством непечатаемых символов.
При определении набора символов каждое слово должно представлять собой число в шестнадцатеричной системе счисления.
Массив ctype занимает первых 257 слов. За ним следуют массивы to_lower, to_upper[] и sort_order[], каждый из которых занимает 256 слов.
See section 4.6.4 Массивы определения символов.
Добавьте имя набора символов в списки CHARSETS_AVAILABLE и COMPILED_CHARSETS файла `configure.in'.
Перенастройте, перекомпилируйте и протестируйте систему.
Для создания сложного набора необходимо выполнить следующие действия:
Создайте файл strings/ctype-MYSET.c в исходном дистрибутиве MySQL.
Вставьте имя MYSET в конец файла sql/share/charsets/Index и присвойте этому набору символов уникальный номер.
Просмотрите один из существующих файлов ctype-*.c (например strings/ctype-big5.c) и узнайте, что нужно определить. Не забывайте, что имена массивов в вашем файле должны быть похожи на следующие: ctype_MYSET, to_lower_MYSET и т.п. Эти имена соответствуют именам массивов из простого набора символов (see section 4.6.4 Массивы определения символов).
В начале файла целесообразно поместить комментарий наподобие следующего:
/* этот комментарий разбирается configure для создания ctype.c, поэтому не меняйте его, если не уверены в правильности своих действий. * .configure. number_MYSET=MYNUMBER .configure. strxfrm_multiply_MYSET=N .configure. mbmaxlen_MYSET=N */
Программа configure использует этот комментарий для линкования набора символов с библиотекой MySQL. Значение строк strxfrm_multiply и mbmaxlen будет разъяснено ниже. Использовать их нужно только в том случае, если вам нужны функции для сортировки строк или работы с многобайтовыми наборами символов соответственно.
После этого нужно создать некоторые из следующих функций:
my_strncoll_MYSET()
my_strcoll_MYSET()
my_strxfrm_MYSET()
my_like_range_MYSET()
See section 4.6.5 Поддержка упорядочивания строк.
Добавьте имя набора символов в списки CHARSETS_AVAILABLE и COMPILED_CHARSETS файла `configure.in'.
Перенастройте, перекомпилируйте и протестируйте систему.
Более подробные инструкции приведены в файле `sql/share/charsets/README'.
Если вы хотите, чтобы ваш набор символов был включен в комплект поставки MySQL, вышлите патч с ним по адресу internals@lists.mysql.com.
Массивы определения символов
Простые массивы to_lower[] и to_upper[] содержат символы верхнего и нижнего регистров, соответствующие каждому из символов набора. Например:
to_lower['A'] should contain 'a' to_upper['a'] should contain 'A'
sort_order[] - карта, устанавливающая правила упорядочивания символов для сравнения и сортировки. Во многих наборах символов эта таблица совпадает с to_upper[] (благодаря чему при сортировке регистр символов не учитывается). MySQL сортирует символы в соответствии со значением sort_order[символ]. Более сложные правила упорядочивания строк разъясняются ниже. See section 4.6.5 Поддержка упорядочивания строк.
ctype[] представляет собой массив битов, по одному элементу на каждый из символов. (Массивы to_lower[], to_upper[], и sort_order[] индексируются по значению символа, а ctype[] - по значению символа + 1. Это позволяет обрабатывать символы EOF).
В файле `m_ctype.h' приведены следующие определения битовых масок:
#define _U 01 /* верхний регистр */ #define _L 02 /* нижний регистр */ #define _N 04 /* число (цифра) */ #define _S 010 /* символ пробела */ #define _P 020 /* знак пунктуации */ #define _C 040 /* управляющий символ */ #define _B 0100 /* пустой символ */ #define _X 0200 /* шестнадцатеричная цифра */
Значение ctype[] для каждого из символов должно представлять собой объединение значений битовых масок, описывающих символ. Например, 'A' представят собой символ верхнего регистра (_U) а также шестнадцатеричную цифру (_X), поэтому элемент ['A'+1] должен содержать значение:
_U + _X = 01 + 0200 = 0201
Поддержка упорядочивания строк
Если правила сортировки вашего естественного языка слишком сложны и не могут быть заданы с помощью простой таблицы sort_order[], необходимо использовать функции упорядочивания строк.
В настоящее время лучшим справочным пособием по этому вопросу являются уже реализованные наборы символов. Примером такой реализации могут служить наборы big5, czech, gbk, sjis и tis160.
В начале файла в особом комментарии необходимо указать значение strxfrm_multiply_MYSET=N. Значение N представляет собой максимальный прирост объема строк во время my_strxfrm_MYSET (т.е. положительное целое число).
Поддержка многобайтовых символов
При желании обеспечить поддержку нового набора, содержащего многобайтовые символы, нужно пользоваться специальными функциями для работы с многобайтовыми символами.
В настоящее время лучшим справочным пособием по этому вопросу являются уже реализованные наборы символов. Примером такой реализации могут служить наборы euc_kr, gb2312, gbk, sjis и ujis. Они реализованы в файлах `ctype-'charset'.c', расположенных в папке `strings'.
В начале файла в особом комментарии необходимо указать значение strxfrm_multiply_MYSET=N. Значение N должно содержать объем самого ``большого'' символа набора в байтах.
Проблемы с наборами символов
При попытке воспользоваться набором символов, не включенным в исполняемый файл, можно столкнуться со следующими неприятностями:
В программе задан неверный путь к каталогу, в котором хранятся наборы символов (по умолчанию это `/usr/local/mysql/share/mysql/charsets'). Данную проблему можно решить с помощью настройки --character-sets-dir.
Набор символов является многобайтовым и не может быть загружен динамически. В таком случае нужно перекомпилировать программу и включить в нее поддержку нужного набора.
Набор символов может быть загружен динамически, но конфигурационного файла для него нет. В таком случае нужно скопировать файл для этого набора из нового дистрибутива MySQL.
В файле `Index' нет имени набора символов.
ERROR 1105: File '/usr/local/share/mysql/charsets/?.conf' not found (Errcode: 2)
В таком случае нужно либо установить новый файл `Index' или вручную внести в него недостающие имена наборов.
Узнать имя набора символов таблиц MyISAM можно с помощью команды myisamchk -dvv table_name.
Обзор серверных сценариев и утилит
Все программы MySQL имеют множество различных опций. При этом каждая программа MySQL поддерживает опцию --help, которую можно использовать для получения полного описания различных опций программы. Например, попробуйте выполнить mysql --help.
Заданные по умолчанию опции для всех стандартных программ можно переопределять при помощи файла опций. See section 4.1.2 Файлы параметров `my.cnf'.
В следующем списке приводятся краткие описания серверных программ MySQL:
myisamchk
Утилита, используемая для описания, проверки, оптимизации и восстановления таблиц MySQL. Поскольку утилита myisamchk имеет много функций, она описывается в отдельном разделе. See section 4 Администрирование баз данных.
make_binary_distribution
Создает бинарную поставку откомпилированного кода MySQL. Эту версию при помощи FTP можно передать на сайт support.mysql.com в директорию `/pub/mysql/Incoming', чтобы ею могли воспользоваться и другие пользователи MySQL.
mysqlbug
Сценарий, составляющий отчет о возникшей в MySQL неполадке. Этот сценарий должен всегда использоваться для составления отчета для почтового списка рассылки MySQL.
mysqld
Сам сервер MySQL, демон. Он должен работать постоянно.
mysql_install_db
Создает таблицы привилегий MySQL с заданными по умолчанию привилегиями. Это обычно делается только один раз, при первой инсталляции MySQL в системе.
Safe_mysqld, оболочка mysqld
В MySQL 4.0 safe_mysqld был переименован в mysqld_safe.
safe_mysqld - это сценарий, с помощью которого рекомендуется запускать демон mysqld на Unix. safe_mysqld служит для реализации неких дополнительных функций безопасности для mysqld, таких как возможность перезапуска сервера при обнаружении ошибки и записи в журнал информации о процессе работы mysqld.
Если не указаны опции --mysqld=# или --mysqld-version=#, safe_mysqld будет использовать исполняемый файл mysqld-max, если последний существует. Если mysqld-max не существует, safe_mysqld запустит mysqld. Это позволяет легко выяснить, что даст использование mysqld-max вместо mysqld: просто скопируйте mysqld-max поверх mysqld, и он будет работать.
Как правило, редактировать сценарий safe_mysqld не следует, однако можно указать опции для safe_mysqld, поместив их в раздел [safe_mysqld] файла `my.cnf'. safe_mysqld будет считывать все опции из разделов файлов опций [mysqld], [server] и [safe_mysqld]. See section 4.1.2 Файлы параметров `my.cnf'.
Обратите внимание: все опции, которые вводятся в командной строке для safe_mysqld, передаются mysqld. Если требуется применить в safe_mysqld
какие-либо опции, которые mysqld не поддерживает, эти опции нужно определить в файле опций.
Большинство опций safe_mysqld - те же, что и у mysqld. See section 4.1.1 Параметры командной строки mysqld.
Safe_mysqld поддерживает следующие опции:
--basedir=path
--core-file-size=#
Размер core-файла который может быть создан mysqld. Значение передается ulimit -c --datadir=path
--defaults-extra-file=path
--defaults-file=path
--err-log=path (устарело в 4.0; Используйте --log-error вместо)
--log-error=path
Писать журнал ошибок в указанный файл. See section 4.9.1 Журнал ошибок. --ledir=path
Путь к mysqld
--log=path
--mysqld=mysqld-version
Имя версии mysqld, которую вы хотите запустить в директории `ledir'
--mysqld-version=version
То же, что и --mysqld=, но в этой опции задается только суффикс для mysqld. Например, если используется --mysqld-version=max, safe_mysqld
запустит версию ledir/mysqld-max. Если задать --mysqld- version без аргумента, будет использоваться ledir/mysqld. --no-defaults
--open-files-limit=#
Максимальное количество файлов, которые могут быть открыты mysqld. Значение передается ulimit -n. Обратите внимание: чтобы эта опция работала корректно, необходимо запустить safe_mysqld от пользователя root! --pid-file=path
--port=#
--socket=path
--timezone=#
Устанавливает переменную часового пояса (TZ) в значение, передаваемое в этом параметре. --user=#
Сценарий safe_mysqld написан таким образом, чтобы можно было запустить сервер, инсталлированный как из исходного кода, так и из бинарной поставки MySQL, даже если компоненты сервера, в зависимости от используемой инсталляции, будут размещены несколько по-другому. Для safe_mysqld
требуется выполнение одного из следующих условий:
Сервер и базы данных можно обнаружить относительно каталога, в котором вызывается safe_mysqld. safe_mysqld ищет в своей рабочей директории `bin' и `data' (для бинарных дистрибутивов) или `libexec' и `var' (для дистрибутивов с исходным кодом). Это условие должно выполняться, если safe_mysqld запускается из директории, в которую инсталлирован MySQL (например `/usr/local/mysql' для бинарного дистрибутива).
Если сервер и базы данных не могут быть найдены относительно рабочей директории, safe_mysqld пытается найти их по абсолютным путям. Типичные местоположения - `/usr/local/libexec' и `/usr/local/var'. Действительные местоположения определяются при создании дистрибутива, из которого запускается safe_mysqld. Они должны быть корректными, если MySQL был инсталлирован в стандартное местоположение.
Поскольку safe_mysqld будет пытаться найти сервер и базы данных относительно собственной рабочей директории, можно инсталлировать двоичный дистрибутив MySQL куда угодно, при условии, что safe_mysqld будет запускаться из директории, в которой установлен MySQL:
shell> cd mysql_installation_directory shell> bin/safe_mysqld &
Если safe_mysqld не может запустить сервер, даже в том случае, когда он вызывается из инсталляционной директории MySQL, сценарий safe_mysqld можно модифицировать так, чтобы он использовал верный путь к mysqld и опции путей, которые являются правильными для вашей системы. Обратите внимание: если в будущем вы будете делать апгрейд MySQL, новая версия safe_mysqld
будет записана поверх старой, поэтому нужно сделать копию отредактированной версии, которую вы сможете затем установить повторно.
Mysqld_multi, программа для управления множеством серверов MySQL
Программа mysqld_multi предназначена для управления несколькими процессами mysqld, работающих на различных сокетах Unix и портах TCP/IP.
Программа будет искать группу(группы) [mysqld#] в `my.cnf' (или заданных при помощи --config-file=... файлах), где # - любое положительное число, начиная с 1. Мы говорим про этот номер далее как про номер группы опций, или GNR. Номера групп различают группы опций одну от другой и используются как аргумент при запуске mysqld_multi чтобы указать, какие сервера вы хотите запустить, остановить или получить статус об. Эти группы должны быть такими же, как и обычная группа [mysqld] (например содержать опции для mysqld; см. в руководстве более подробную информацию), но с такими портом, сокетом и т.д., которые требуются для каждого отдельного процесса mysqld.
mysqld_multi запускается в таком синтаксисе:
Использование: mysqld_multi [OPTIONS] {start|stop|report} [GNR,GNR,GNR...] или mysqld_multi [OPTIONS] {start|stop|report} [GNR-GNR,GNR,GNR-GNR,...]
GNR здесь означает номер группы. Можно запускать, останавливать или создавать отчеты о любом GNR, или о нескольких из них одновременно. Получить пример о том, как бы вы могли настроить файл опций, можно так:
shell> mysqld_multi --example
В качестве разделителей в списке GNR применяются запятые, комбинации создаются при помощи тире. Последнее означает, что будут задействованы все номера GNR из диапазона GNR1-GNR2. Если не задан аргумент GNR, то все группы будут либо запущены, либо остановлены, либо будет выведен отчет об этих группах. Обратите внимание, что в списке GNR не должно быть никаких пропусков (пробелов, символов табуляции или пустых строк). Любые данные после пропуска будут игнорироваться.
mysqld_multi поддерживает следующие опции:
--config-file=...
Альтернативный файл конфигурации (config file). Примечание: данный файл не влияет на собственные опции этой программы (группа [mysqld_multi]), а только на группы [mysqld#]. Без этой опции поиск всех данных будет осуществляться только в обычном файле `my.cnf'.
--example
Представляет пример файла конфигурации.
--help
Выводит справочную информацию и завершает работу.
--log=...
Файл журнала. Имя файла журнала и полный путь к нему. Примечание: если файл существует, записи будут добавляться в конец файла.
--mysqladmin=...
Исполняемый файл mysqladmin, используемый для завершения работы сервера.
--mysqld=...
Исполняемый файл mysqld, который будет использоваться. Обратите внимание: в этой опции можно также указывать safe_mysqld. Опции передаются mysqld. Необходимо только удостовериться, что в переменной окружения PATH имеется mysqld или что установлен safe_mysqld.
--no-log
Вывод в stdout вместо журнала. По умолчанию журналы включены.
--password=...
Пароль пользователя для доступа к mysqladmin.
--tcp-ip
Подсоединение к серверу(ам) MySQL по TCP/IP вместо Unix-сокетов. Данная опция влияет на завершение работы сервера и создание отчетов. Если файл сокета отсутствует, сервер будет работать, но к нему можно будет обращаться только через порт TCP/IP. По умолчанию соединение осуществляется через сокет Unix.
--user=...
Имя пользователя MySQL для mysqladmin.
--version
Вывод номера версии и завершение работы.
Некоторые примечания относительно mysqld_multi:
Удостоверьтесь, что пользователь MySQL, останавливающий mysqld
(например, при помощи mysqladmin), имеет один пароль и имя пользователя для всех директорий данных, к которым производится доступ (имеется в виду - к базе данных mysql). Убедитесь также, что пользователь имеет привилегию Shutdown_priv! Если имеется несколько директорий с данными и несколько различных баз данных mysql с различными паролями для пользователя root в MySQL, можно создать некоего общего пользователя multi_admin для всех, с одинаковым паролем (см. ниже). Сделать это можно так:
shell> mysql -u root -S /tmp/mysql.sock -proot_password -e "GRANT SHUTDOWN ON *.* TO multi_admin@localhost IDENTIFIED BY
See section 4.2.6 Как работает система привилегий. Эти действия нужно выполнять для каждого mysqld для каждой имеющейся директории данных (для этого нужно выбрать другой сокет -S=...).
`pid-файл' играет очень важную роль, если для запуска mysqld используется сценарий safe_mysqld (например, --mysqld=safe_mysqld). Преимущество использования safe_mysqld вместо mysqld заключается в том, что safe_mysqld
``бережет'' каждый процесс mysqld и перезапустит его, если mysqld-процесс умрет по сигналу 9 или подобному (например, в случае ошибки сегментации - хотя, конечно, уж этой ошибки MySQL в принципе совершать не должен;). Пожалуйста, обратите внимание: может оказаться, что сценарий safe_mysqld
требуется запускать из определенного каталога. Это означает, что прежде чем запустить mysqld_multi, прийдется перейти в нужный каталог. Если при запуске возникнут проблемы, пожалуйста, просмотрите сценарий safe_mysqld. Обратите внимание на следующие строки:
-------------------------------------------------------------------------- MY_PWD=`pwd` Check if we are starting this relative (for the binary release) if test -d /data/mysql -a -f ./share/mysql/english/errmsg.sys -a -x ./bin/mysqld --------------------------------------------------------------------------
See section 4.7.2 safe_mysqld, оболочка mysqld.
Этот тест может пройти успешно, однако возможны и проблемы.
Не запускайте несколько демонов mysqld с одной и тожй же директорией данных. Используйте различные директории с данными, если Вы четко не уверены в своих действиях!
Файл сокета и порт TCP/IP должны быть различными для каждого демона mysqld.
Первая и пятая группы mysqld были преднамеренно не включены в пример. В файле конфигурации могут быть ``промежутки'' - это увеличивает гибкость. Порядок, в котором запускаются или завершают работу демоны mysqld, зависит от порядка, в котором они указаны в файле конфигурации.
Когда нужно обратиться к некоторой группе (GNR) в этой программе, просто используйте номер в конце имени группы. Например, GNR для группы [mysqld17] - 17.
Для mysqld можно использовать опцию --user, но для этого сценарий mysqld_multi должен быть запущен от root. Наличие опции в файле конфигурации не имеет значения; вы получите предупреждение только в случаях, если не являетесь суперпользователем и демон mysqlds запущен под вашим аккаунтом Unix. Важно: удостоверьтесь, что для pid-файла и директории с данными имеется доступ для чтения+записи(+выполнения - для директории с данными) для того пользователя Unix, который запускает определенный процесс mysqld. Не используйте для этого аккаунт root в Unix, если Вы не уверены в своих действиях!
Очень важно: удостоверьтесь, что вы понимаете значения опций, которые передаются демонам mysqld, и что осознаете то, почему могут быть нужны отдельные процессы mysqld. Запуск нескольких демонов mysqld с одной директорией данных не увеличит производительность в многопоточной системе!
See section 4.1.4 Запуск нескольких серверов MySQL на одном компьютере.
Пример файла конфигурации для mysqld_multi.
# Этот файл может находиться в вашей домашней директории (~/.my.cnf) или /etc/my.cnf # Version 2.1 by Jani Tolonen
[mysqld_multi] mysqld = /usr/local/bin/safe_mysqld mysqladmin = /usr/local/bin/mysqladmin user = multi_admin password = multipass
[mysqld2] socket = /tmp/mysql.sock2 port = 3307 pid-file = /usr/local/mysql/var2/hostname.pid2 datadir = /usr/local/mysql/var2 language = /usr/local/share/mysql/english user = john
[mysqld3] socket = /tmp/mysql.sock3 port = 3308 pid-file = /usr/local/mysql/var3/hostname.pid3 datadir = /usr/local/mysql/var3 language = /usr/local/share/mysql/swedish user = monty
[mysqld4] socket = /tmp/mysql.sock4 port = 3309 pid-file = /usr/local/mysql/var4/hostname.pid4 datadir = /usr/local/mysql/var4 language = /usr/local/share/mysql/estonia user = tonu
[mysqld6] socket = /tmp/mysql.sock6 port = 3311 pid-file = /usr/local/mysql/var6/hostname.pid6 datadir = /usr/local/mysql/var6 language = /usr/local/share/mysql/japanese user = jani
See section 4.1.2 Файлы параметров `my.cnf'.
Myisampack, MySQL-генератор сжатых таблиц (только для чтения)
Утилита myisampack используется для сжатия таблиц MyISAM, а утилита pack_isam - для сжатия таблиц ISAM. Поскольку таблицы ISAM являются устаревшими, здесь будет рассматриваться только myisampack, но все, сказанное относительно myisampack, справедливо также и для pack_isam.
myisampack сжимает каждый столбец в таблице по отдельности. Информация, необходимая для декомпрессии столбцов, считывается в память при открытии таблицы. В результате обеспечивается более высокая производительность при доступе к отдельным записям, поскольку нужно распаковывать только одну запись, а не значительно больший по размеру дисковый блок, как при использовании программы Stacker в MS DOS. В среднем myisampack сжимает файл данных на 40%-70%.
(MySQL использует отображение в памяти (mmap()) для сжатых таблиц
а если mmap() не работает, возвращается назад к нормальному режиму чтения/записи.
Обратите внимание на следующее:
После сжатия таблица доступна в режиме только для чтения. Это удобно, скажем, для записи на CD. Реализация возможности записи в сжатые таблицы находится в нашем списке задач к выполнению, но имеет низкий приоритет.
myisampack может также сжимать столбцы c типами BLOB или TEXT. В предыдущей версии pack_isam (для таблиц ISAM) данной функции не было.
Утилиту myisampack можно запустить следующим образом:
shell> myisampack [options] filename ...
Каждое имя файла (filename) должно быть именем индексного файла (`.MYI'). Если вы не находитесь в директории базы данных, необходимо указать полный путь к файлу. Допускается опускать расширение `.MYI'.
myisampack поддерживает следующие опции:
-b, --backup
Создает резервную копию таблицы, присваивая ей имя `tbl_name.OLD'.
-#, --debug=debug_options
Выводить журнал отладки. Строка debug_options часто принимает значение d:t:o,filename
-f, --force
Сжатие таблицы происходит, даже если она увеличивается или если существует временный файл. Во время сжатия таблицы myisampack создает временный файл `tbl_name.TMD'. Если вы вручную прекратите выполнение myisampack, может оказаться так, что файл `tbl_name.TMD' не будет удален. Обычно если myisampack обнаруживает существующий `tbl_name.TMD', она прекращает работу и выдает ошибку. При указании опции --force myisampack сжимает таблицу в любом случае.
-?, --help
Выдает справочную информацию и завершает работу.
-j big_tbl_name, --join=big_tbl_name
Соединяет все таблицы, указанные в командной строке, в одну таблицу big_tbl_name. Все таблицы, подлежащие объединению, должны быть идентичными (одинаковые имена и типы столбцов, одинаковые индексы и т.д.).
-p #, --packlength=#
Определяет разрядность поля, хранящего длину строки, в байтах. Может принимать значения 1, 2 или 3. (myisampack хранит все строки с указателями длины размером в 1, 2, или 3 байта. В большинстве случаев myisampack способна определить правильное значение длины перед началом сжатия файла, но во время сжатия она может обнаружить, что может быть использована более короткая длина. В этом случае myisampack выведет сообщение о том, что в следующий раз при сжатии данного файла можно использовать более короткую длину записи.)
-s, --silent
Молчаливый режим. Сообщения выводятся только при возникновении ошибок.
-t, --test
Сжатие таблицы не выполняется, происходит только проверка процедуры сжатия.
-T dir_name, --tmp_dir=dir_name
Указанная директория используется как местоположение для создания временной таблицы.
-v, --verbose
Расширенный режим вывода сообщений. Выводится информация о состоянии процесса и результаты сжатия.
-V, --version
Отображает информацию о версии и завершает работу.
-w, --wait
Если таблица уже используется, подождать повторить попытку. Если сервер mysqld был вызван с опцией --skip-external-locking, то не самая лучшая идея - вызывать myisampack, если таблица может модифицироваться во время процесса сжатия.
Последовательность приведенных ниже команд иллюстрирует типичный сеанс сжатия таблицы:
shell> ls -l station.* -rw-rw-r-- 1 monty my 994128 Apr 17 19:00 station.MYD -rw-rw-r-- 1 monty my 53248 Apr 17 19:00 station.MYI -rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm
shell> myisamchk -dvv station
MyISAM file: station Isam-version: 2 Creation time: 1996-03-13 10:08:58 Recover time: 1997-02-02 3:06:43 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafile pointer (bytes): 2 Keyfile pointer (bytes): 2 Max datafile length: 54657023 Max keyfile length: 33554431 Recordlength: 834 Record format: Fixed length
table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 4 unique unsigned long 1024 1024 1 2 32 30 multip. text 10240 1024 1
Field Start Length Type 1 1 1 2 2 4 3 6 4 4 10 1 5 11 20 6 31 1 7 32 30 8 62 35 9 97 35 10 132 35 11 167 4 12 171 16 13 187 35 14 222 4 15 226 16 16 242 20 17 262 20 18 282 20 19 302 30 20 332 4 21 336 4 22 340 1 23 341 8 24 349 8 25 357 8 26 365 2 27 367 2 28 369 4 29 373 4 30 377 1 31 378 2 32 380 8 33 388 4 34 392 4 35 396 4 36 400 4 37 404 1 38 405 4 39 409 4 40 413 4 41 417 4 42 421 4 43 425 4 44 429 20 45 449 30 46 479 1 47 480 1 48 481 79 49 560 79 50 639 79 51 718 79 52 797 8 53 805 1 54 806 1 55 807 20 56 827 4 57 831 4
shell> myisampack station.MYI Compressing station.MYI: (1192 records) - Calculating statistics
normal: 20 empty-space: 16 empty-zero: 12 empty-fill: 11 pre-space: 0 end-space: 12 table-lookups: 5 zero: 7 Original trees: 57 After join: 17 - Compressing file 87.14%
shell> ls -l station.* -rw-rw-r-- 1 monty my 127874 Apr 17 19:00 station.MYD -rw-rw-r-- 1 monty my 55296 Apr 17 19:04 station.MYI -rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm
shell> myisamchk -dvv station
MyISAM file: station Isam-version: 2 Creation time: 1996-03-13 10:08:58 Recover time: 1997-04-17 19:04:26 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafilepointer (bytes): 3 Keyfile pointer (bytes): 1 Max datafile length: 16777215 Max keyfile length: 131071 Recordlength: 834 Record format: Compressed
table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 4 unique unsigned long 10240 1024 1 2 32 30 multip. text 54272 1024 1
Field Start Length Type Huff tree Bits 1 1 1 constant 1 0 2 2 4 zerofill(1) 2 9 3 6 4 no zeros, zerofill(1) 2 9 4 10 1 3 9 5 11 20 table-lookup 4 0 6 31 1 3 9 7 32 30 no endspace, not_always 5 9 8 62 35 no endspace, not_always, no empty 6 9 9 97 35 no empty 7 9 10 132 35 no endspace, not_always, no empty 6 9 11 167 4 zerofill(1) 2 9 12 171 16 no endspace, not_always, no empty 5 9 13 187 35 no endspace, not_always, no empty 6 9 14 222 4 zerofill(1) 2 9 15 226 16 no endspace, not_always, no empty 5 9 16 242 20 no endspace, not_always 8 9 17 262 20 no endspace, no empty 8 9 18 282 20 no endspace, no empty 5 9 19 302 30 no endspace, no empty 6 9 20 332 4 always zero 2 9 21 336 4 always zero 2 9 22 340 1 3 9 23 341 8 table-lookup 9 0 24 349 8 table-lookup 10 0 25 357 8 always zero 2 9 26 365 2 2 9 27 367 2 no zeros, zerofill(1) 2 9 28 369 4 no zeros, zerofill(1) 2 9 29 373 4 table-lookup 11 0 30 377 1 3 9 31 378 2 no zeros, zerofill(1) 2 9 32 380 8 no zeros 2 9 33 388 4 always zero 2 9 34 392 4 table-lookup 12 0 35 396 4 no zeros, zerofill(1) 13 9 36 400 4 no zeros, zerofill(1) 2 9 37 404 1 2 9 38 405 4 no zeros 2 9 39 409 4 always zero 2 9 40 413 4 no zeros 2 9 41 417 4 always zero 2 9 42 421 4 no zeros 2 9 43 425 4 always zero 2 9 44 429 20 no empty 3 9 45 449 30 no empty 3 9 46 479 1 14 4 47 480 1 14 4 48 481 79 no endspace, no empty 15 9 49 560 79 no empty 2 9 50 639 79 no empty 2 9 51 718 79 no endspace 16 9 52 797 8 no empty 2 9 53 805 1 17 1 54 806 1 3 9 55 807 20 no empty 3 9 56 827 4 no zeros, zerofill(2) 2 9 57 831 4 no zeros, zerofill(1) 2 9
Ниже приведено описание вывода myisampack:
normal
Количество столбцов, для которых не используется никакого дополнительного сжатия.
empty-space
Количество столбцов, содержащих пустые значения; эти занимают по 1 биту.
empty-zero
Количество целочисленных столбцов, в которых содержатся только двоичные нули (ascii 0); каждый из них будет занимать 1 бит
empty-fill
Количество целочисленных столбцов, значения которых не полностью занимают отведенную для них разрядность в байтах; тип этих столбцов изменяется на тип с меньшей разрядностью(например, столбец INTEGER может быть изменен на MEDIUMINT).
pre-space
Количество десятичных столбцов, которые хранятся с начальными пробелами. В этом случае каждое значение будет содержать число ведущих пробелов.
end-space
Количество столбцов, имеющих много оконечных пробелов. В этом случае каждое значение будет содержать число таких пробелов.
table-lookup
Столбец имеет только небольшое количество различающихся значений, которые перед сжатием Хаффмана (Huffman) конвертируются в ENUM.
zero
Количество столбцов, все значения которых являются нулями.
Original trees
Начальное количество деревьев Хаффмана.
After join
Количество различных деревьев Хаффмана, оставленных после соединения деревьев для сохранения немного пространства в заголовках.
После сжатия таблицы myisamchk -dvv выводит дополнительную информацию по каждому полю:
Type
Тип поля может содержать следующие дескрипторы:
constant
Все строки содержат одинаковое значение.
no endspace
Не сохраняются замыкающие пробелы.
no endspace, not_always
Не сохраняются замыкающие пробелы и не производится сжатие за счет замыкающих пробелов для всех значений.
no endspace, no empty
Не сохраняются замыкающие пробелы. Не сохраняются пустые значения.
table-lookup
Столбец был преобразован к ENUM.
zerofill(n)
В значении n главных байтов всегда являются 0 и не сохранены.
no zeros
Не сохраняются нули.
always zero
Значения 0 хранятся в 1 бите.
Huff tree
Дерево Хаффмана, связанное с полем.
Bits
Количество битов, используемых в дереве Хаффмана.
После запуска pack_isam/myisampack нужно запустить isamchk/myisamchk для повторного создания индекса. В это время можно также отсортировать индексные блоки и создать статистику, необходимую для более эффективной работы оптимизатора MySQL:
myisamchk -rq --analyze --sort-index table_name.MYI isamchk -rq --analyze --sort-index table_name.ISM
После установки сжатой таблицы в директорию базы данных MySQL нужно проделать операцию mysqladmin flush-tables, чтобы сервер mysqld начал использовать новую таблицу.
Для распаковки сжатой таблицы можно использовать опцию --unpack isamchk
или myisamchk.
Mysqld-max, расширенный сервер mysqld
mysqld-max - это сервер MySQL (mysqld), скомпилированный со следующими конфигурационными опциями:
Опция | Описание |
--with-server-suffix=-max | Добавляет суффикс к версии mysqld. |
--with-innodb | Поддержка таблиц InnoDB. |
--with-bdb | Поддержка таблиц Беркли DB (BDB) |
CFLAGS=-DUSE_SYMDIR | Символические ссылки для Windows. |
Бинарную версию MySQL-max можно найти по адресу http://www.mysql.com/downloads/mysql-max-3.23.html.
Бинарные дистрибутивы Windows MySQL включают стандартный двоичный файл mysqld.exe а также двоичный файл mysqld-max.exe. http://www.mysql.com/downloads/mysql-3.23.html. See section 2.1.2 Установка MySQL на Windows.
Обратите внимание: поскольку таблицы InnoDB и Berkeley DB доступны не для всех платформ, некоторые из двоичных дистрибутивов могут не поддерживать оба этих типа таблиц. Проверить, какие типы таблиц поддерживаются, можно при помощи следующего запроса:
mysql> SHOW VARIABLES LIKE "have_%"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | have_bdb | YES | | have_innodb | NO | | have_isam | YES | | have_raid | NO | | have_openssl | NO | +---------------+-------+
Значения имеют следующий смысл:
Значение | Описание |
YES | Опция активизирована. |
NO | MySQL не поддерживает эту опцию. |
DISABLED | Опция xxxx заблокирована, потому что mysqld был запущен с параметром --skip-xxxx или потому, что mysqld был запущен не со всеми опциями, необходимыми для того, чтобы использование данной опции было возможным. В этом случае файл `hostname.err' будет содержать причину, по которой опция заблокирована. |
Примечание: чтобы получить возможность создавать таблицы InnoDB, вы должны
отредактировать опции, включив по меньшей мере опцию innodb_data_file_path. See section 7.5.2 Параметры запуска InnoDB.
Чтобы улучшить производительность таблиц BDB, для них нужно также добавить некоторые конфигурационные опции. See section 7.6.3 Параметры запуска BDB.
safe_mysqld будет автоматически пытаться запустить двоичный mysqld с суффиксом -max. Таким образом можно просто осуществлять тестирование свежесобранного бинарного mysqld в существующей инсталляции. Для этого нужно выполнить configure с требуемыми опциями, собрать, и затем установить новый mysqld как mysqld-max в тот же самый каталог, где находится ``старый'' бинарный mysqld. See section 4.7.2 safe_mysqld, оболочка mysqld.
Обзор клиентских сценариев и утилит
Все клиенты MySQL, которые взаимодействуют с сервером с помощью библиотеки mysqlclient, используют следующие переменные окружения:
Имя | Описание |
MYSQL_UNIX_PORT | Сокет, используемый по умолчанию для локальных подсоединений |
MYSQL_TCP_PORT | Устанавливаемый по умолчанию порт TCP/IP |
MYSQL_PWD | Устанавливаемый по умолчанию пароль |
MYSQL_DEBUG | Опции пошаговой отладки программ |
TMPDIR | Каталог для создания временных таблиц/файлов |
Использование MYSQL_PWD небезопасно. See section 4.2.8 Соединение с сервером MySQL.
Клиент mysql использует файл, указанный в переменной окружения MYSQL_HISTFILE, для хранения истории командной строки. Значение по умолчанию для этого файла истории - $HOME/.mysql_history, где $HOME - значение переменной окружения HOME. See section F Переменные окружения.
Все программы MySQL принимают множество различных опций. При этом каждая программа MySQL поддерживает опцию --help, которую можно использовать для получения полного описания различных опций программы. Например, попробуйте запустить mysql --help.
Для всех стандартных клиентских программ можно переопределить значения опций по умолчанию, используя файл опций. See section 4.1.2 Файлы параметров `my.cnf'.
В приведенном ниже списке дано краткое описание клиентских программ MySQL:
msql2mysql
Сценарий оболочки операционной системы, преобразующий программы базы данных mSQL к виду, приемлемому для MySQL. Он не обрабатывает всех случаев, но с него хорошо начинать такое преобразование.
mysqlaccess
Сценарий, который проверяет привилегии доступа для комбинации значений хоста, пользователя и базы данных.
mysqladmin
Утилита для выполнения административных функций, таких как создание или удаление баз данных, перезагрузка таблиц привилегий, запись на диск содержимого таблиц, находящегося в буфере, повторное открытие файлов журналов. Утилита mysqladmin может также использоваться для получения информации с сервера о номере версии, процессах и состоянии сервера. См. раздел See section 4.8.3 mysqladmin, Администрирование MySQL-сервера..
mysqldump
Выводит содержимое базы данных MySQL в виде файла с SQL-операторами или в виде текстовых файлов с символом табуляции в качестве разделителя. Усовершенствованная свободно распространяемая утилита, автором которой является Игорь Романенко. See section 4.8.5 mysqldump, Получение дампов данных и структуры таблицы.
mysqlimport
Импортирует текстовые файлы в соответствующие таблицы, используя команду LOAD DATA INFILE. See section 4.8.7 mysqlimport, импорт данных из текстовых файлов.
mysqlshow
Отображает информацию о существующих базах данных, таблицах, полях и индексах.
replace
Служебная программа, использующаяся в сценарии msql2mysql, но имеющая также более широкое применение. Утилита replace изменяет строки, находящиеся в файлах или в стандартных входных данных. Использует принцип конечного автомата, чтобы в первую очередь найти соответствие длинных строк. Может применяться для замены строк. Например, эта команда меняет местами a и b в данных файлах:
shell> replace a b b a -- file1 file2 ...
Mysql, Утилита командной строки
Утилита командной строки mysql является простой SQL-оболочкой (с возможностями библиотеки readline проекта GNU). Она поддерживает интерактивный и неинтерактивный режимы. В интерактивном режиме результаты запроса представляются в ASCII-формате. При использовании в неинтерактивном режиме (например, в качестве фильтра) результат представляется в текстовом формате с символом табуляции в качестве разделителя (выходной формат можно изменить при помощи параметров командной строки). Сценарии можно запускать, как показано ниже:
shell> mysql database < script.sql > output.tab
Если возникают проблемы из-за недостатка памяти на данном клиенте, применяйте параметр --quick! Это заставит mysql использовать функцию mysql_use_result() вместо функции mysql_store_result() для получения результирующей выборки данных.
Использовать mysql очень легко. Запустите mysql database или mysql --user=user_name --password=your_password database. Наберите SQL-команду прямо в командной строке, завершив ее одним из символов: `;', `\g' или `\G', и нажмите клавишу ``Ввод''.
Утилита командной строки mysql поддерживает следующие параметры:
-?, --help
Вывод справочной информации об использовании программы и выход из нее.
-A, --no-auto-rehash
Отключает автоматическое рехеширование. rehash следует использовать для получения хеша таблиц и полей. Это обеспечивает более быстрый старт mysql.
--prompt=...
Устанавливает приглашение на ввод команд в заданном формате.
-b, --no-beep
Выключает звуковой сигнал об ошибке.
-B, --batch
Выводит результаты в пакетном режиме с символом табуляции в качестве разделителя, каждая строка с новой строки. Файл истории не используется.
--character-sets-dir=...
Директория, где находятся наборы символов.
-C, --compress
Использовать сжатие данных в протоколе сервер/клиент.
-#, --debug[=...]
Журнал отладки. Значение по умолчанию - 'd:t:o,/tmp/mysql.trace'.
-D, --database=...
Имя используемой базы данных. Большей частью применяется в конфигурационном файле `my.cnf'.
--default-character-set=...
Установить набор символов по умолчанию.
-e, --execute=...
Выполнить команду и завершить программу (вывод результата как и для --batch).
-E, --vertical
Вывести результаты запроса (строки) по вертикали. Можно произвести вывод подобным образом и без данного параметра, завершая команды символами \G.
-f, --force
Продолжать обработку даже при обнаружении ошибки SQL.
-g, --no-named-commands
Выключает именованные команды. Следует использовать только команды вида \* либо применять именованные команды только в начале строки, заканчивающейся символом `;'. Начиная с версии 10.9 клиент запускается с этой опцией, включенной по умолчанию! С опцией -g, однако, длинные команды все еще работают с первой строки.
-G, --enable-named-commands
Разрешает именованные команды. Допускаются длинные команды, а также укороченные команды вида \*.
-i, --ignore-space
Игнорировать пробел после имен функций.
-h, --host=...
Подсоединиться к базе данных на указанном хосте.
-H, --html
Вывести выходные данные в виде HTML.
-X, --xml
Вывести выходные данные в виде XML.
-L, --skip-line-numbers
Не указывать номера строк для ошибок. Полезно для сравнения результирующих файлов, включающих сообщения об ошибках.
--no-pager
Блокирует пейджер (программа постраничного вывода) и выводит результат в стандартный вывод stdout (в Unix). Смотрите также команду \h
(интерактивная помощь).
--no-tee
Блокирует выходной файл. Смотрите также команду \h (интерактивная помощь).
-n, --unbuffered
Очищать буфер после каждого запроса.
-N, --skip-column-names
Не указывать имена столбцов в результатах.
-O, --set-variable var=option
Установить значение переменной. Список используемых переменных выводится через --help. Обратите внимание, что --set-variable не используется в MySQL 4.0. Просто используйте --var=option.
-o, --one-database
Обновить только базу данных, установленную по умолчанию. Позволяет пропускать обновления другой базы данных в журнале обновления.
--pager[=...]
Устанавливает тип данных вывода. По умолчанию это переменная окружения PAGER. Ее возможные значения - less, more, cat [> имя файла], и т.д. См. также команду \h (интерактивная помощь). Этот параметр не работает в пакетном (batch) режиме. Пейджер работает только под Unix.
-p[password], --password[=...]
Пароль, используемый при подсоединении к серверу баз данных. Если в командной строке пароль не указан, то он запрашивается у пользователя. При использовании краткой формы -p не оставляйте пробел между параметром и значением пароля.
-P порт, --port=порт
Номер порта TCP/IP, используемый для подсоединения.
--protocol=(TCP | SOCKET | PIPE | MEMORY)
Для указания протокола соединения, который надлежит использовать. Новшество в MySQL 4.1.0.
-q, --quick
Не кэшировать результат. Выводить его строка за строкой так, как он приходит от сервера. Это может замедлить скорость работы сервера, если вывод результата будет приостановлен. Файл истории не используется.
-r, --raw
Показывать значения столбцов без какого-либо преобразования. Используется с --batch.
-s, --silent
Режим молчания. Выводить только сообщения об ошибках.
-S --socket=...
Файл сокета, используемый для подсоединения.
-t --table
Выводить результат в табличном формате. Установлено по умолчанию для непакетного режима.
-T, --debug-info
Выводить некоторые отладочные данные при выходе из программы.
--tee=...
Присоединить что-либо к выходному файлу. Смотрите также команду \h (интерактивная помощь). Этот параметр не работает в пакетном режиме.
-u, --user=#
Имя пользователя MySQL, если этот пользователь не является активным в данное время.
-U, --safe-updates[=#], --i-am-a-dummy[=#]
Разрешает выполнять только операции UPDATE и DELETE, используя ключи. Более полная информация об этом параметре приведена ниже. Можно сбросить данный параметр, установив в конфигурационном файле `my.cnf' значение аргумента --safe-updates=0.
-v, --verbose
Более расширенный режим вывода результатов (-v -v -v дает формат вывода таблицы).
-V, --version
Вывод информации о версии и выход из программы.
-w, --wait
Если соединение с сервером упало, подождать и попытаться восстановить его, вместо того, чтобы прервать работу.
Через параметры командной строки -O или --set-variable (в MySQL 4.0 используйте просто --var=option) можно также установить следующие переменные:
Имя переменной | По умолчанию | Описание |
connect_timeout | 0 | Число секунд до истечения времени ожидания соединения |
max_allowed_packet | 16777216 | Максимальная величина пакета, посылаемого/принимаемого с сервера |
net_buffer_length | 16384 | Размер буфера для TCP/IP и сокетного соединения |
select_limit | 1000 | Автоматическое ограничение количества команд SELECT при использовании --i-am-a-dummy |
max_join_size | 1000000 | Автоматическое ограничение количества связанных строк при использовании --i-am-a-dummy. |
Если ввести в командной строке help, программа mysql выведет список поддерживаемых ею команд:
mysql> help
Команды MySQL help (\h) Выводит данный текст. ? (\h) Синоним для help. clear (\c) Команда очистки. connect (\r) Снова подключиться к серверу. Дополнительные аргументы - db и host. edit (\e) Редактировать текущую команду с помощью $EDITOR. ego (\G) Послать текущую команду MySQL серверу и вывести результат по вертикали. exit (\q) Выйти из программы. То же что и quit. go (\g) Послать текущую команду MySQL серверу. nopager (\n) Блокировать пейджер, выводить через stdout. notee (\t) Не добавлять записи в выходной файл outfile. pager (\P) Установить PAGER [to_pager]. Выводить результаты запроса через PAGER. print (\p) Вывести текущую команду. prompt (\R) Изменить формат приглашения на ввод команд mysql. quit (\q) Выйти из программы. rehash (\#) Восстановить таблицу хэшей. source (\.) Запустить на выполнение файл с SQL-сценарием. Указать имя файла в качестве аргумента. status (\s) Получить информацию о статусе сервера. tee (\T) Установить параметр outfile [to_outfile]. Присоединить что-либо к данному выходному файлу. use (\u) Использовать другую базу данных. Указать имя базы данных в качестве аргумента.
Команда pager работает только под Unix.
Команда status дает информацию о текущем соединении и используемом сервере. Если вы работаете в режиме --safe-updates, команда status также выведет значения переменных для mysql, которые влияют на ваши запросы.
Для начинающих рекомендуется пользоваться программой mysql с установленным параметром (введен в MySQL 3.23.11) --safe-updates (или --i-am-a-dummy для пользователей, выполнивших DELETE FROM table_name, но забывших указать аргументы в WHERE). В этом случае mysql при установлении соединения посылает следующую команду MySQL-серверу:
SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=#select_limit#, SQL_MAX_JOIN_SIZE=#max_join_size#"
где #select_limit# и #max_join_size# - переменные, которые можно установить из командной строки mysql. See section 5.5.6 Синтаксис команды SET.
Результат этого следующий:
Не разрешено выполнять команды UPDATE или DELETE, если не указаны ограничения по ключам в секции WHERE. Однако можно заставить выполняться команды UPDATE/DELETE, используя оператор LIMIT:
UPDATE table_name SET not_key_column=# WHERE not_key_column=# LIMIT 1;
Все слишком большие результаты ограничены строками #select_limit#.
SELECTы, которые могут потребовать для исполнения количество комбинаций строк более, чем #max_join_size#, будут прерваны.
Несколько полезных советов по использованию клиента mysql:
Некоторые данные более удобочитаемы при выводе их по вертикали вместо обычно используемого горизонтального окна вывода. Например, текст, который больше по длине, чем по ширине, и содержит в себе много новых строк, часто намного легче читать в вертикальном представлении.
mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 lIMIT 300,1\G *************************** 1. row *************************** msg_nro: 3068 date: 2000-03-01 23:29:50 time_zone: +0200 mail_from: Monty reply: monty@no.spam.com mail_to: "Thimble Smith" sbj: UTF-8 txt: >>>>> "Thimble" == Thimble Smith writes: Thimble> Hi. I think this is a good idea. Is anyone familiar with UTF-8 Thimble> or Unicode? Otherwise, I'll put this on my TODO list and see what Thimble> happens.
Yes, please do that. Regards, Monty file: inbox-jani-1 hash: 190402944 1 row in set (0.09 sec)
Для журналирования можно использовать опции команды tee. Она может быть запущена с помощью параметра --tee=... для mysql или интерактивно из командной строки вводом команды tee. Все представляемые на экране данные будут также добавлены к заданному файлу. Это может быть очень полезно для целей отладки программы. Утилиту tee можно блокировать из командной строки командой notee. Повторный запуск команды tee снова включит журналирование. Если при этом параметр для команды tee не указан, то будет использоваться предыдущий файл. Следует учесть, что команда tee будет записывать результаты в файл после каждой выполненной команды, как раз перед появлением командной строки для ввода очередной команды.
При помощи опции --pager[=...] стал возможным просмотр или поиск результатов в интерактивном режиме с помощью Unix-программ less, more
или иных подобных. Если явно не указать аргумент в этом параметре, клиент mysql будет искать переменную окружения PAGER и установит значение pager. Программу pager также можно запустить из интерактивной командной строки командой pager и остановить командой nopager. Команда может принимать аргумент, который является необязательным; pager будет установлена в значение этого аргумента.. Команда pager может быть вызвана и без аргумента, но это требует использования опции --pager или соответствующей установки по умолчанию стандартного вывода stdout. Команда pager работает только в Unix, поскольку использует функцию popen(), отсутствующую в Windows. Вместо этого в Windows можно использовать параметр tee, хотя в ряде ситуаций это менее удобно, чем применение команды pager.
Несколько советов касательно команды pager:
Ее можно использовать для записи в файл:
mysql> pager cat > /tmp/log.txt
и результаты будут направлены только в файл. Вызываемые командой pager
программы могут принимать любые допустимые опции:
mysql> pager less -n -i -S
Обратите особое внимание на опцию -S в вышеприведенном примере. Она может быть очень полезна при просмотре результатов. Попробуйте применить ее с горизонтальным выводом (завершайте команды символами '\g', or ';') и с вертикальным (в конце команд - '\G'). Очень громоздкие результаты вывода иногда трудно бывает прочесть с экрана, в этом случае команда less с опцией -S позволит просмотреть результаты в интерактивном режиме слева направо, при этом при появлении строк с длиной больше, чем ширина экрана, их вывод будет продолжен вывод с новой строки. Вывод данных в таких случаях получается более удобочитаемым. При интерактивном вызове команды less с опцией '-S' можно переключать режим ее работы (включено/выключено) из командной строки. Чтобы получить дополнительную информацию относительно less, обращайтесь к описанию команды 'h'.
В заключение отметим ( если вы этого еще не поняли из предыдущих примеров :), что существует возможность комбинировать очень сложные способы обработки результатов. Так, в следующем примере результаты будут посланы в два различных каталога, смонтированных на двух различных жестких дисках в /dr1 and /dr2, и, несмотря на это, результаты можно увидеть на экране посредством команды less:
mysql> pager cat | tee /dr1/tmp/res.txt | \ tee /dr2/tmp/res2.txt | less -n -i -S
Приведенные выше функции можно тоже комбинировать: запустив tee и установив pager в less, можно просматривать результаты с помощью Unix-команды less и при этом одновременно производить запись в файл. Разница между служебной Unix-утилитой tee, используемой в программе pager, и встроенной в клиент mysql командой tee заключается в том, что встроенная команда tee работает даже в том случае, если в Unix утилита tee недоступна. Встроенная команда tee также ведет запись всего, что выводится на экран, тогда как утилита Unix tee, используемая с pager, не делает этого в достаточном объеме. Последнее, но тем не менее важное обстоятельство состоит в том, что интерактивная команда tee
более удобна для переключения режимов работы включено/выключено, если при записи в файл иногда возникает необходимость отключить эту функцию.
Начиная с версии MySQL 4.0.2 можно изменить формат приглашения в командной строке клиента mysql.
Возможны следующие опции приглашения:
Опция | Описание |
\v | версия mysqld |
\d | имя используемой базы данных |
\h | имя хоста, к которому производится подсоединение |
\p | номер порта, через который производится подсоединение |
\u | имя пользователя |
\U | полный адрес username@host |
\\ | обратный слэш `\' |
\n | символ новой строки |
\t | табуляция |
\ | пробел |
\_ | пробел с подчеркиванием |
\R | время по военному часовому поясу (0-23) |
\r | время по стандартному часовому поясу (1-12) |
\m | минуты |
\y | два разряда года |
\Y | четыре разряда года |
\D | полный формат даты |
\s | секунды |
\w | день недели в трехбуквенном формате (Mon, Tue, ...) |
\P | Время до полудня/после полудня (am/pm) |
\o | месяц в числовом формате |
\O | месяц в трехбуквенном формате (Jan, Feb, ...) |
\c | Счетчик, подсчитывающий количество вводимых команд |
Символ `\' за которым следует любая другая буква, просто дополняет эту букву.
Установить параметры приглашения можно следующими способами:
В переменных окружения
Можно установить переменную окружения MYSQL_PS1 для строки приглашения. Например:
shell> export MYSQL_PS1="(\u@\h) [\d]> "
`my.cnf'
`.my.cnf'
Можно установить опцию prompt в любом конфигурационном файле MySQL в группе mysql. Например:
[mysql] prompt=(\u@\h) [\d]>\_
В командной строке
Можно установить опцию --prompt из командной строки утилиты mysql. Например:
shell> mysql --prompt="(\u@\h) [\d]> " (user@host) [database]>
В интерактивном режиме
Можно также использовать команду prompt (или \R) для изменения настроек приглашения в интерактивном режиме. Например:
mysql> prompt (\u@\h) [\d]>\_ PROMPT set to '(\u@\h) [\d]>\_'
(user@host) [database]> (user@host) [database]> prompt Возвращение к исходным (по умолчанию) настройкам PROMPT в утилите mysql> mysql>
Mysqladmin, Администрирование MySQL-сервера.
Утилита для выполнения административных операций. Ее синтаксис:
shell> mysqladmin [ПАРАМЕТРЫ] command [command-option] command ...
Список опций, поддерживаемых вашей конкретной версией mysqladmin, можно получить, выполнив команду mysqladmin --help.
Текущая версия mysqladmin поддерживает следующие команды:
create databasename
Создать новую базу данных.
drop databasename
Удалить базу данных и все ее таблицы.
extended-status
Выдает расширенный отчет о состоянии сервера (более полный, чем при команде status )
flush-hosts
Сбросить и перезагрузить хосты.
flush-logs
Сбросить на диск и переоткрыть все журналы.
flush-tables
Закрыть все открытые таблицы.
flush-privileges
Перечитать таблицы привилегий.
kill id,id,...
Завершить потоки mysql с указанными thread-id.
password
Установить новый пароль для сервера баз данных. Изменить старый пароль на новый.
ping
Проверить, работает ли сервер mysqld.
processlist
Показать список активных потоков на сервере.
reload
Перезагрузить таблицы привилегий.
refresh
Выполнить все табличные операции, находящиеся в буфере, закрыть и открыть заново все системные журналы.
shutdown
Завершить работу сервера баз данных.
slave-start
Запустить подчиненный дублирующий поток.
slave-stop
Остановить подчиненный дублирующий поток.
status
Выдает краткий отчет о состоянии сервера.
variables
Вывести доступные для использования переменные.
version
Вывести данные о версии сервера.
Все команды могут сокращаться до их уникальных префиксов. Например:
shell> mysqladmin proc stat +----+-------+-----------+----+-------------+------+-------+------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------+-----------+----+-------------+------+-------+------+ | 6 | monty | localhost | | Processlist | 0 | | | +----+-------+-----------+----+-------------+------+-------+------+ Uptime: 10077 Threads: 1 Questions: 9 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 2 Memory in use: 1092K Max memory used: 1116K
Результат команды mysqladmin status выводится в виде следующих столбцов:
Столбец | Описание |
Uptime | Количество секунд с момента запуска MySQL-сервера. |
Threads | Количество активных потоков (клиентов). |
Questions | Количество вопросов от клиентов с момента запуска программы mysqld. |
Slow queries | Количество запросов, потребовавших большее количество секунд, чем установлено в конфигурации ключом long_query_time. See section 4.9.5 Журнал медленных запросов. |
Opens | Количество таблиц, открытых программой mysqld. |
Flush table | Количество выполненных команд flush ..., refresh, reload. |
Open tables | Количество таблиц, открытых в данное время. |
Memory in use | Память, используемая непосредственно программой mysqld (доступно только в случае компиляции MySQL с установленным значением --with-debug=full). |
Max memory used | Максимальный объем памяти, использованный непосредственно программой mysqld (доступно только в случае компиляции MySQL с установленным значением --with-debug=full). |
При выполнении mysqladmin shutdown через сокет (другими словами, через компьютер с запущенным mysqld) mysqladmin будет ожидать, пока на сервере MySQL не будет удален файл pid-file (в котором содержится идентификатор процесса `pid' запущенного сервера) чтобы убедиться, что сервер остановлен должным образом.
Использование mysqlcheck для сопровождения и аварийного восстановления таблиц.
Начиная с версии MySQL 3.23.38 можно применять новый инструмент для проверки и восстановления MyISAM-таблиц. Отличие mysqlcheck от myisamchk
состоит в том, что утилита mysqlcheck должна использоваться при работающем сервере mysqld, в то время как myisamchk - при остановленном. Преимущество же заключается в том, что теперь не нужно останавливать сервер для проверки или восстановления таблиц.
Утилита mysqlcheck использует соответствующие команды MySQL-сервера CHECK, REPAIR, ANALYZE и OPTIMIZE удобным для пользователя образом.
Существует три альтернативных способа запуска mysqlcheck:
shell> mysqlcheck [OPTIONS] database [tables] shell> mysqlcheck [OPTIONS] --databases DB1 [DB2 DB3...] shell> mysqlcheck [OPTIONS] --all-databases
Таким образом, утилита может использоваться подобно mysqldump по отношению к выбранным базам данных и таблицам.
В сравнении с другими клиентами утилита mysqlcheck имеет следующую отличительную особенность: установка поведения по умолчанию, (проверка таблиц, -с), может быть изменена путем переименования исполняемого файла утилиты. Итак, чтобы получить инструмент, восстанавливающий таблицы по умолчанию, просто скопируйте mysqlcheck с новым именем, mysqlrepair, или, наоборот, сделайте символьную ссылку на mysqlrepair и обозначьте ее как mysqlrepair. Если теперь запустить mysqlrepair, то утилита по умолчанию будет восстанавливать таблицы.
Для изменения поведения mysqlcheck по умолчанию можно использовать следующие обозначения:
mysqlrepair: Значение по умолчанию будет -r mysqlanalyze: Значение по умолчанию будет -a mysqloptimize: Значение по умолчанию будет -o
Ниже приведены возможные опции для mysqlcheck. Какие из них поддерживает ваша версия, можно проверить с помощью команды mysqlcheck --help.
-A, --all-databases
Проверить все базы данных. Аналогична опции --databases, если указать все базы данных.
-1, --all-in-1
Вместо выполнения запросов для каждой таблицы в отдельности выполнить все запросы в одном отдельно для каждой таблицы. Имена таблиц будут представлены в виде списка имен, разделенных запятой.
-a, --analyze
Анализировать данные таблицы.
--auto-repair
Если проверенная таблица повреждена, автоматически восстановить ее. Исправления будут произведены после проверки всех таблиц, если были обнаружены повреждения.
-#, --debug=...
Выводит информацию журнала отладки. Часто используется следующий набор параметров: 'd:t:o,filename'
--character-sets-dir=...
Директория, где находятся установки символов.
-c, --check
Проверить таблицу на наличие ошибок.
-C, --check-only-changed
Проверить только таблицы, измененные со времени последней проверки или некорректно закрытые.
--compress
Использовать сжатие данных в протоколе сервер/клиент.
-?, --help
Вывести данную вспомогательную информацию и выйти из программы.
-B, --databases
Проверить несколько баз данных. Обратите внимание на разницу в использовании: в этом случае таблицы не указываются. Все имена аргументов рассматриваются как имена баз данных.
--default-character-set=...
Установить набор символов по умолчанию.
-F, --fast
Проверить только базы данных, которые не были закрыты должным образом.
-f, --force
Продолжать даже при получении ошибки SQL.
-e, --extended
При использовании данного параметра совместно с CHECK TABLE можно быть на 100 процентов быть уверенным в целостности таблицы, хотя это и займет много времени. Если же использовать этот параметр с REPAIR TABLE, запустится расширенное восстановление таблицы, которое может потребовать не только длительного времени выполнения, но и привнесет также массу ненужных строк!
-h, --host=...
Подключиться к хосту.
-m, --medium-check
Быстрее, чем --extended-check, но находит только 99,99 процентов всех ошибок. Для большинства случаев этот вариант вполне подходит.
-o, --optimize
Оптимизировать таблицу.
-p, --password[=...]
Используемый пароль при подключении к серверу. Если пароль не указан, у пользователя запрашивается пароль с терминала.
-P, --port=...
Номер порта, используемого для подключения по TCP/IP.
--protocol=(TCP | SOCKET | PIPE | MEMORY)
Для указания протокола соединения, который надлежит использовать. Новшество в MySQL 4.1.0.
-q, --quick
При использовании данной опции совместно с CHECK TABLE предотвращается сканирование строк для корректировки неправильных связей. Это наиболее быстрый метод проверки. Если же использовать этот параметр с REPAIR TABLE, программа попытается восстановить только систему индексов. Это наиболее быстрый метод восстановления таблицы.
-r, --repair
Может исправить почти все, за исключением уникальных ключей, имеющих дубликаты.
-s, --silent
Выводить только сообщения об ошибках.
-S, --socket=...
Файл сокета, используемый для подсоединения.
--tables
Перекрывает опцию --databases (-B).
-u, --user=#
Имя пользователя MySQL, если этот пользователь в данное время не является активным.
-v, --verbose
Вывести информацию о различных этапах.
-V, --version
Вывести информацию о версии и выйти из программы.
Mysqldump, Получение дампов данных и структуры таблицы
Данная утилита позволяет получить дамп (``моментальный снимок'') содержимого базы данных или совокупности баз для создания резервной копии или пересылки данных на другой SQL-сервер баз данных (не обязательно MySQL-сервер). Дамп будет содержать набор команд SQL для создания и/или заполнения таблиц.
Если же резервная копия создается на сервере, то вместо описываемой утилиты следует использовать mysqlhotcopy. См.раздел See section 4.8.6 mysqlhotcopy, Копирование баз данных и таблиц MySQL.
shell> mysqldump [OPTIONS] database [tables] или mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] или mysqldump [OPTIONS] --all-databases [OPTIONS]
Если не указывать имена таблиц или использовать параметры --databases или --all-databases, то будет получен дамп базы данных в целом (соответственно - всех баз данных).
Перечень опций, поддерживаемых вашей конкретной версией утилиты mysqldump, можно получить, выполнив команду mysqldump --help.
Следует иметь в виду, что утилита mysqldump, используемая без опций --quick или --opt, перед тем, как сделать дамп результата выборки информации, загрузит весь результат в память. Это может создать проблемы при получении дампа большой базы данных.
Учтите, что не следует применять параметры --opt или -e, если вы собираетесь использовать для получения дампа новую копию программы mysqldump, а затем воспроизводить его на очень старом MySQL-сервере.
Утилита mysqldump поддерживает следующие опции:
--add-locks
Добавить команды LOCK TABLES перед выполнением и UNLOCK TABLE после выполнения каждого дампа таблицы (для ускорения доступа к MySQL).
--add-drop-table
Добавить команду DROP TABLE перед каждой командой CREATE TABLE.
-A, --all-databases
Произвести дамп всех баз данных. Аналогично опции --databases с указанием всех баз данных.
-a, --all
Включить все опции создания объектов, специфичные для MySQL.
--allow-keywords
Разрешить создавать имена столбцов, которые совпадают с ключевыми словами. Отсутствие конфликтов обеспечивается прибавлением имени таблицы в качестве префикса к имени каждого столбца.
-c, --complete-insert
Использовать полные команды INSERT (с именами столбцов).
-C, --compress
Использовать сжатие всей информации между клиентом и сервером, если они оба поддерживают сжатие.
-B, --databases
Выполнить дамп нескольких баз данных. Обратите внимание на разницу в использовании: в этом случае таблицы не указываются. Все имена аргументов рассматриваются как имена баз данных. Оператор USE db_name; включается в вывод перед каждой новой базой данных.
--delayed
Использовать команду INSERT DELAYED при вставке строк.
-e, --extended-insert
Использовать команду INSERT с новым многострочным синтаксисом (повышает компактность и быстродействие операторов ввода).
-#, --debug[=option_string]
Отслеживать прохождение программы (для отладки).
--help
Вывести справочную информацию и выйти из программы.
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--lines-terminated-by=...
Эти опции используются совместно с параметром -T и имеют то же самое значение, что и соответствующие операторы для LOAD DATA INFILE. См. раздел See section 6.4.9 Синтаксис оператора LOAD DATA INFILE.
-F, --flush-logs
Записать на диск данные системного журнала из буфера MySQL-сервера перед началом выполнения дампа.
-f, --force,
Продолжать даже при получении ошибки SQL при выполнении дампа таблицы.
-h, --host=..
Выполнить дамп данных MySQL сервера на указанном хосте. Значение хоста по умолчанию - localhost.
-l, --lock-tables.
Заблокировать все таблицы перед началом выполнения дампа. Таблицы блокируются оператором READ LOCAL, чтобы разрешить параллельные записи для MyISAM-таблиц. Следует отметить, что при выполнении дампа совокупности баз данных опция --lock-tables блокирует таблицы каждой базы по отдельности. Таким образом, использование этого параметра не гарантирует, что таблицы будут логически непротиворечивы в пределах этих баз данных. В различных базах данных при выполнении дампа таблицы могут находиться в совершенно разных состояниях.
-K, --disable-keys
Добавляет выражение /*! 40000 ALTER TABLE tb_name DISABLE KEYS */;
и /*!40000 ALTER TABLE tb_name ENABLE KEYS */; в выводе результата. Это ускорит загрузку данных на сервер MySQL 4.0, так как индексы создаются после внесения всех данных.
-n, --no-create-db
В выводе результата выражение CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name; будет отсутствовать. Данная строка будет добавлена в любом случае при использовании опций --databases или --all-databases.
-t, --no-create-info
Не записывать информацию о создании таблицы (команда CREATE TABLE).
-d, --no-data
Не записывать информацию из строк таблицы. Это очень полезно для получения дампа структуры таблицы!
--opt
То же, что и --quick --add-drop-table --add-locks --extended-insert --lock-tables. Должно дать наиболее быстрый дамп для чтения на MySQL-сервере.
-pyour_pass, --password[=your_pass]
Используемый пароль при подключении к серверу. Если аргумент =your_pass не введен, mysqldump предложит ввести пароль.
-P port_num, --port=port_num
Номер порта TCP/IP, используемого для подключения к хосту.
--protocol=(TCP | SOCKET | PIPE | MEMORY)
Для указания протокола соединения, который надлежит использовать. Новшество в MySQL 4.1.0.
-q, --quick
Выводить дамп непосредственно на стандартный вывод stdout без буферизации запроса. Для этого используется функция mysql_use_result().
-Q, --quote-names
Взять в кавычки имена таблиц и столбцов без символов ``'.
-r, --result-file=...
Прямой вывод указанного файла. Этот опцию следует использовать в MS DOS, так как она предотвращает преобразование символа новой строки '\n' в последовательность '\n\r' (новая строка + возврат каретки).
--single-transaction
Данная опция выдает SQL-команду BEGIN перед выполнением дампа данных с сервера. Наиболее часто используется с InnoDB-таблицамии и уровнем изоляции транзакций READ_COMMITTED, так как именно в этом режиме можно получить дамп с непротиворечивым состоянием базы данных после выполнения команды BEGIN без блокирования каких-либо приложений. Используя эту опцию, необходимо помнить, что при выполнении дампа только транзакционные таблицы будут находиться в непротиворечивом состоянии, т.е. некоторые MyISAM- или HEAP-таблицы при использовании данной опции могут все же изменить свое состояние.
Опция --single-transaction добавлена в версии 4.0.2. Она является взаимоисключающей по отношению к опции --lock-tables, так как команда LOCK TABLES уже принимает открытую транзакцию.
-S /path/to/socket, --socket=/path/to/socket
Файл сокета для подсоединения к localhost (значение хоста по умолчанию).
--tables
Перекрывает параметр --databases (-B).
-T, --tab=path-to-some-directory
Для каждой заданной таблицы создает файл a `table_name.sql', содержащий SQL CREATE команды для создания таблицы, и файл `table_name.txt' с данными таблицы. Файл `.txt' имеет формат в соответствии с параметрами --fields-xxx и --lines--xxx. Примечание: Этот параметр работает только при условии, что утилита mysqldump запущена на том же компьютере, что и демон mysqld, причем пользователь/группа, запустившие данный поток mysqld (обычно это пользователь mysql и группа mysql), должны иметь право создавать/записывать файл по указанному адресу.
-u user_name, --user=user_name
Имя пользователя MySQL-сервера, используемое при подключении к серверу. Значением по умолчанию является имя пользователя Unix.
-O var=option, --set-variable var=option
Установить значения переменных. Доступные для использования переменные перечислены ниже. В MySQL 4.0 просто используйте --var=option.
-v, --verbose
Расширенный режим вывода. Вывод более детальной информации о работе программы.
-V, --version
Вывести информацию о версии и выйти из программы.
-w, --where='where-condition'
Выполнить дамп только выбранных записей. Обратите внимание, что кавычки обязательны.
"--where=user='jimf'" "-wuserid>1" "-wuserid
-X, --xml
Представляет дамп базы данных в виде XML.
-x, --first-slave
Блокирует все таблицы во всех базах данных.
-O net_buffer_length=#, where # < 16M
При создании многострочных операторов ввода (как и в случаях применения параметров --extended-insert или --opt) утилита mysqldump будет создавать строки длиной вплоть до указанной в net_buffer_length. При увеличении значения этой переменной необходимо также убедиться в том, что в MySQL-сервере для переменной max_allowed_packet указано значение больше, чем величина net_buffer_length.
Чаще всего утилита mysqldump используется для получения резервной копии всех баз данных. See section 4.4.1 Резервное копирование баз данных.
mysqldump --opt database > backup-file.sql
Можно, наоборот, прочитать этот файл на MySQL-сервере посредством команды:
mysql database < backup-file.sql
или
mysql -e "source /patch-to-backup/backup-file.sql" database
Данная утилита достаточно часто используется и для переноса информации из базы данных на другой MySQL-сервер:
mysqldump --opt database | mysql --host=remote-host -C database
Вполне возможно получить дамп нескольких баз данных с помощью одной команды:
mysqldump --databases database1 [database2 ...] > my_databases.sql
Если необходим дамп всех баз данных, можно использовать:
mysqldump --all-databases > all_databases.sql
Mysqlhotcopy, Копирование баз данных и таблиц MySQL
Утилита mysqlhotcopy представляет собой Perl-сценарий, использующий SQL-команды LOCK TABLES, FLUSH TABLES и Unix-утилиты cp или scp для быстрого получения резервной копии базы данных. Пожалуй, это наиболее быстрый способ копирования баз данных или таблиц, но он может работать только на том же компьютере, где расположены каталоги копируемой базы данных.
mysqlhotcopy db_name [/path/to/new_directory] mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory mysqlhotcopy db_name./regex/
Утилита mysqlhotcopy поддерживает следующие опции:
-?, --help
Показать окно справки и выйти из программы.
-u, --user=#
Имя пользователя для входа в базу данных.
-p, --password=#
Используемый пароль при подсоединении к серверу.
-P, --port=#
Номер порта, используемого для подсоединения к локальному серверу.
-S, --socket=#
Номер сокета, используемого для подсоединения к локальному серверу.
--allowold
Не делать прерывания, если объект уже существует (переименовать в it_old).
--keepold
Не удалять предыдущий результат (только что переименованный) после выполнения команды.
--noindices
Не включать обширные индексные файлы в копию, чтобы сделать дубликат меньше по размеру и более быстрым. Индексы можно реконструировать позже с помощью команды myisamchk -rq.
--method=#
Метод копирования (cp или scp).
-q, --quiet
Выводить только сообщения об ошибках.
--debug
Разрешить отладку.
-n, --dryrun
Сообщать о действиях без их выполнения.
--regexp=#
Копировать все базы данных с именами, встречающимися в функции regexp.
--suffix=#
Суффикс для имен скопированных баз данных.
--checkpoint=#
Внести проверочную запись в предусмотренную таблицу базы данных.
--flushlog
Записать на диск данные журналов из буфера, как только все таблицы заблокируются.
--tmpdir=#
Временная директория (вместо `/tmp').
Более полное описание данного сценария можно посмотреть в документации по языку программирования Perl.
Сценарий mysqlhotcopy берет информацию для групп [client] и [mysqlhotcopy] из файлов опций.
Для выполнения программы mysqlhotcopy необходимы доступ для записи в директорию, куда будет помещена копия, и привилегия выполнения команды SELECT для копируемых таблиц и команды RELOAD для MySQL-сервера (чтобы выполнить FLUSH TABLES).
Mysqlimport, импорт данных из текстовых файлов
Утилита mysqlimport обеспечивает интерфейс командной строки для SQL-оператора LOAD DATA INFILE. Большинство параметров mysqlimport
полностью соответствует аналогичным параметрам для оператора LOAD DATA INFILE. See section 6.4.9 Синтаксис оператора LOAD DATA INFILE.
Утилита mysqlimport вызывается следующим образом:
shell> mysqlimport [параметры] database textfile1 [textfile2 ...]
Для каждого текстового файла, указанного в командной строке, mysqlimport
удаляет расширение в каждом имени файла и использует его, чтобы определить, в какую таблицу занести содержимое. Например, файлы с именами `patient.txt', `patient.text' и `patient' должны быть все занесены в таблицу с именем `patient'.
Утилита mysqlimport поддерживает следующие опции:
-c, --columns=...
Эта опция принимает в качестве аргумента список разделенных запятыми имен полей. Данный список полей используется для создания соответствующей команды LOAD DATA INFILE, которая затем посылается в MySQL. See section 6.4.9 Синтаксис оператора LOAD DATA INFILE.
-C, --compress
Использовать компрессию в связи между клиентом и сервером, если они оба поддерживают сжатие.
-#, --debug[=option_string]
Отслеживать прохождение программы (для отладки).
-d, --delete
Удалить данные из таблицы перед импортированием текстового файла.
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--lines-terminated-by=...
Эти опции аналогичны соответствующим операторам для LOAD DATA INFILE. See section 6.4.9 Синтаксис оператора LOAD DATA INFILE.
-f, --force
Игнорировать ошибки. Например, если таблица для текстового файла не существует, продолжать обработку остающихся файлов. Без параметра --force утилита mysqlimport прекращает работу при отсутствии таблицы.
--help
Вывести справочную информацию и выйти из программы.
-h host_name, --host=host_name
Импортировать данные в MySQL-сервер на указанном хосте. Значение хоста по умолчанию - localhost.
-i, --ignore
См. описание для параметра --replace.
-l, --lock-tables
Заблокировать все таблицы для записи перед обработкой любых текстовых файлов. Это обеспечивает синхронизацию всех таблиц на сервере.
-L, --local
Читать входящие файлы из клиента. По умолчанию предполагается, что текстовые файлы расположены на сервере при подсоединении к localhost
(значение хоста по умолчанию).
-pyour_pass, --password[=your_pass]
Используемый пароль при подключении к серверу. Если аргумент =your_pass не введен, mysqlimport предложит ввести пароль.
-P port_num, --port=port_num
Номер порта TCP/IP, используемого для подсоединения к хосту.
--protocol=(TCP | SOCKET | PIPE | MEMORY)
Для указания протокола соединения, который надлежит использовать. Новшество в MySQL 4.1.0.
-r, --replace
Опции --replace и --ignore управляют обработкой поступающих на вход записей, которые дублируют имеющиеся записи по значениям уникальных ключей. Если задано значение --replace, новые строки заменяют существующие с тем же самым значением уникального ключа. Если задано значение --ignore, входные строки, которые дублируют существующую строку по значению уникального ключа, пропускаются. Если же ни одна из опций не задана, то при обнаружении ключа-дубликата возникает ошибка и остаток текстового файла игнорируется.
-s, --silent
Режим молчания. Выводить только сообщения об ошибках.
-S /path/to/socket, --socket=/path/to/socket
Файл сокета для подсоединения к localhost (значение хоста по умолчанию).
-u user_name, --user=user_name
Имя пользователя MySQL-сервера, используемое при подсоединении к серверу. Значением по умолчанию является имя для входа в Unix.
-v, --verbose
Расширенный режим вывода. Вывод более детальной информации о работе программы.
-V, --version
Вывести информацию о версии и выйти из программы.
Ниже приведен пример листинга программы, использующей утилиту mysqlimport:
$ mysql --version mysql Ver 9.33 Distrib 3.22.25, for pc-linux-gnu (i686) $ uname -a Linux xxx.com 2.2.5-15 #1 Mon Apr 19 22:21:09 EDT 1999 i586 unknown $ mysql -e 'CREATE TABLE imptest(id INT, n VARCHAR(30))' test $ ed a 100 Max Sydow 101 Count Dracula . w imptest.txt 32 q $ od -c imptest.txt 0000000 1 0 0 \t M a x S y d o w \n 1 0 0000020 1 \t C o u n t D r a c u l a \n 0000040 $ mysqlimport --local test imptest.txt test.imptest: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0 $ mysql -e 'SELECT * FROM imptest' test +------+---------------+ | id | n | +------+---------------+ | 100 | Max Sydow | | 101 | Count Dracula | +------+---------------+
Mysqlshow, просмотр баз данных, таблиц и столбцов
Утилита mysqlshow позволяет кратко ознакомиться с существующими базами данных, их таблицами и столбцами таблиц.
Аналогичную информацию можно получить с помощью программы mysql, используя команду SHOW. See section 4.5.6 Синтаксис команды SHOW.
Утилита mysqlshow вызывается следующим образом:
shell> mysqlshow [ПАРАМЕТРЫ] [database [table [column]]]
Если имя базы данных не указано, то выдается список всех существующих баз данных.
Если не указана таблица - показываются все таблицы, найденные в этой базе данных
Если не задан столбец - показываются все найденные в таблице столбцы и представленные в виде столбцов данные.
Следует отметить, что в более новых версиях MySQL пользователь может просмотреть только те базы/таблицы/столбцы, для которых у него имеются соответствующие привилегии.
Если последний аргумент содержит в себе шаблонные символы (*, ?, % или _) процессора или SQL, то будут представлены только данные, совпадающие с шаблоном. Если имя базы данных содержит подчеркивание, то оно должно быть экранировано обратным слешом (некоторые оболочки в Unix востребуют два обратных слеша) для того, чтобы получить корректные имена. `*' корвертируются в `%' и `?' - в `_'.
Это может вызвать путаницу при попытке просмотреть столбцы таблицы с символом _, так как в таком случае mysqlshow
покажет только имена таблиц, совпадающие с шаблоном. Ситуацию можно легко исправить добавлением дополнительного символа % в конец командной строки (как отдельного аргумента).
Mysql_config, Получение опций компиляции для компиляции клиентских программ
mysql_config дает полезную информацию о том, как компилировать ваши клиентские программы.
mysql_config поддерживает такие опции:
--cflags
Опции компилятора для поиска включаемых файлов --libs
Библиотеки и опции, необходимые для линкования с клиентской библиотекой. --socket
Имя сокета по умолчанию, определенное, когда конфигурировался MySQL. --port
Номер порта по умолчанию, определенный, когда конфигурировался MySQL. --version
Номер версии и версия для поставки MySQL. --libmysqld-libs
Библиотеки и опции, необходимые для линкования с библиотекой встраиваемого сервера.
Если вы выполняете mysql_config без каких-либо параметров, вы получите все опции, которые он поддерживает плюс значение этих опций:
shell> mysql_config sage: /usr/local/mysql/bin/mysql_config [OPTIONS] Options: --cflags [-I'/usr/local/mysql/include/mysql'] --libs [-L'/usr/local/mysql/lib/mysql' -lmysqlclient -lz -lcrypt -lnsl -lm -L/usr/lib -lssl -lcrypto] --socket [/tmp/mysql.sock] --port [3306] --version [4.0.8-gamma] --libmysqld-libs [ -L'/usr/local/mysql/lib/mysql' -lmysqld -lpthread -lz -lcrypt -lnsl -lm -lpthread -lrt]
Вы можете это использовать, чтобы скопмилировать клиента MySQL таким образом:
CFG=/usr/local/mysql/bin/mysql_config sh -c "gcc -o progname `$CFG --cflags` progname.c `$CFG --libs`"
Perror, разъяснение кодов ошибок
Для большинства системных ошибок, помимо внутреннего текстового сообщения MySQL, можно также выводить номер кода системной ошибки в одном из следующих стилей: message ... (errno: #) или message ... (Errcode: #).
Выяснить, что данный код ошибки означает, можно либо путем изучения документации на данную систему, либо воспользовавшись возможностями утилиты perror.
perror выводит описание кода системной ошибки или код ошибки обработчика таблиц MyISAM/ISAM.
perror вызывается следующим образом:
shell> perror [ПАРАМЕТРЫ] [ERRORCODE [ERRORCODE...]]
Пример:
shell> perror 13 64 Error code 13: Доступ запрещен Error code 64: Компьютер не находится в сети
Следует учитывать, что сообщения об ошибках в большинстве своем являются системно-зависимыми!
Как запускать SQL-команды из текстового файла
Обычно клиент mysql используется в интерактивном режиме, например, следующим образом:
shell> mysql database
Однако вполне можно поместить SQL команды в текстовый файл и указать mysql
считывать входные данные из этого файла. Для этого необходимо создать текстовый файл text_file, содержащий команды, которые предстоит выполнить. Затем запускаем mysql как показано ниже:
shell> mysql database < text_file
Можно также запустить текстовый файл с командой USE db_name. В этом случае указывать имя базы данных в командной строке не обязательно:
shell> mysql < text_file
Если программа mysql уже работает, можно запустить файл с SQL-сценарием, используя команду source:
mysql> source filename;
Более подробная информация по пакетному режиму работы находится в разделе See section 3.6 Использование mysql в пакетном режиме.
Журнал ошибок
Журнал ошибок содержит информацию о том, когда запускается и останавливается mysqld, а также все критические ошибки, обнаруженные в процессе работы.
В нем содержится информация о запуске и завершении работы mysqld, а также обо всех серьезных ошибках, возникших во время работы. Если произойдет неожиданное аварийное завершение работы, и safe_mysqld придется перезапустить mysqld, safe_mysqld внесет в этот файл соответствующую запись. Кроме того, в этот журнал заносится предупреждение в том случае, если mysqld обнаружит таблицу, нуждающуюся в автоматической проверке или исправлении.
Все ошибки mysqld записывает в stderr, который сценарий safe_mysqld
перенаправляет в файл с именем 'hostname'.err (в Windows mysqld сохраняет его в каталоге `\mysql\data\mysql.err').
В некоторых ОС в журнал включается распечатка части стека погибшего mysqld. С помощью этой информации можно определить причину сбоя (see section E.1.4 Использование трассировки стека).
Начиная с MySQL 4.0.10 можно указать, где именно mysqld должен сохранять журнал ошибок, с помощью опции --log-error[=filename]. Если имя файла не задается, то тогда mysqld будет использовать mysql-data-dir/'hostname'.err на Unix и `\mysql\data\mysql.err' на windows.
Если вы выполняете FLUSH LOGS старый файл будет сохранен с префиксом --old и mysqld создаст новый пустой журнал.
На старых версиях MySQL журнал ошибок велся скриптом mysqld_safe, который перенаправлял вывод в файл 'hostname'.err. В старых версиях можно было изменить имя этого файла опцией --err-log=filename.
Если вы не указываете --log-error или используете опцию --console, то ошибки будут выводиться на stderr (на терминал).
На Windows вывод всегда пишется в .err-файл если --console не была указана.
Общий журнал запросов
Если вы хотите знать обо всем, что происходит с mysqld, нужно запустить систему с ключом --log[=file]. После этого информация обо всех соединениях и запросах будет записываться в файл журнала (по умолчанию ему дается имя 'hostname'.log). Этот журнал может оказаться полезным, если вы подозреваете наличие ошибки в клиентском ПО и хотите выяснить, что, по мнению mysqld, клиент передал базе.
Старые версии скрипта mysql.server (с MySQL 3.23.4 по 3.23.8) передавали safe_mysqld опцию --log (включить общий журнал запросов). Если вам нужна большая производительность при запуске MySQL в промышленной эксплуатации, вы можете удалить опцию --log из mysql.server или поменять ее на --log-bin. See section 4.9.4 Бинарный журнал обновлений.
Записи в журнал заносятся по мере получения mysqld запросов. Порядок их занесения может отличаться от порядка выполнения команд. В этом и заключается основное отличие данного журнала от журналов обновлений и бинарных журналов, в которые информация заносится по мере выполнения запросов, но до отмены блокировок.
Журнал обновлений (update)
Обратите внимание: журнал обновлений (update) заменен бинарным журналом (binary) (see section 4.9.4 Бинарный журнал обновлений. С этим журналом можно производить те же операции, что и с журналом обновлений.
При запуске с ключом --log-update[=file_name] mysqld создает журнал, в который заносятся все команды SQL, обновляющие данные. Если имя файла не задано, по умолчанию ему присваивается имя хоста. Если файлу присвоено имя, не содержащее пути доступа к нему, этот файл сохраняется в каталоге с данными. Если у имени `file_name' нет расширения, mysqld даст файлу примерно такое имя: `file_name.###', где ### - номер, увеличивающийся при каждом выполнении команд mysqladmin refresh, mysqladmin flush-logs, FLUSH LOGS или при перезапуске сервера.
Обратите внимание: чтобы вышеописанная схема могла работать, нельзя самостоятельно создавать файлы с тем же именем, что и у журнала обновлений, а также с некоторыми расширениями, которые могут быть восприняты как номер, в каталоге, использующемся для хранения этого журнала!
При запуске с ключами --log или -l mysqld создает общий журнал в файле с именем `hostname.log', причем перезапуски и обновления не приводят к созданию нового файла журнала (хотя существующий при таких операциях закрывается и затем открывается вновь). В таком случае скопировать его (в Unix) можно так:
mv hostname.log hostname-old.log mysqladmin flush-logs cp hostname-old.log to-backup-directory rm hostname-old.log
Журнал обновлений работает избирательно - в него попадают только те команды, которые действительно обновляют данные. Команда UPDATE или DELETE, выражение WHERE которой не находит совпадающих строк, в журнал не заносится - как и команды UPDATE, присваивающие столбцам те же значения, которые у них были до ``обновления''.
Запись в журнал осуществляется сразу по завершении работы запроса, но до того, как будут сняты блокировки. Таким образом обеспечивается уверенность в том, что журнал ведется именно в порядке выполнения запросов.
При желании обновить базу в соответствии с данными журналов обновлений можно воспользоваться следующей командой (при условии, что имена файлов журналов соответствуют форме `file_name.###'):
shell> ls -1 -t -r file_name.[0-9]* | xargs cat | mysql
ls расставляет все файлы журналов в правильном порядке.
Эта возможность может пригодиться в случае, если возникнет необходимость (в результате серьезного сбоя) привести базу в соответствие с резервной копией и затем повторить все обновления, произошедшие с момента создания копии и до сбоя.
Бинарный журнал обновлений
Бинарный журнал обновлений в скором времени должен полностью заменить журнал обновлений, так что мы рекомендуем вам как можно скорее перейти на его использование!
Бинарный журнал содержит всю информацию, имеющуюся в журнале обновлений, в более эффективном формате. В нем имеется информация и о времени выполнения каждого обновляющего базу запроса. В нем не содержится информации о запросах, которые не изменяют данные. Если вам нужно журналировать все запросы (например для выявления проблемного запроса), вам следует использовать общий журнал запросов. See section 4.9.2 Общий журнал запросов.
Бинарный журнал используется и при репликации подчиненного сервера (slave) с головного (master) (see section 4.10 Репликация в MySQL).
При запуске с ключом --log-bin[=file_name] mysqld создает файл журнала, в который вносятся данные обо всех обновляющих данные командах SQL. Если имя файла не задано, по умолчанию ему дается имя хоста с окончанием -bin. Если файлу присвоено имя, не содержащее пути доступа к нему, этот файл сохраняется в каталоге данных.
При вводе расширения в имя файла (например: --log-bin=filename.extension) это расширение удаляется без предупреждения.
К имени файла бинарного журнала программа mysqld прибавляет специальное расширение - номер, увеличивающийся при каждом выполнении команд mysqladmin refresh, mysqladmin flush-logs, FLUSH LOGS или перезапуске сервера. При достижении файлом журнала максимального размера, заданного в параметре max_binlog_size, автоматически создается новый. Все неактивные файлы бинарных журналов можно удалить командой RESET MASTER (see section 4.5.4 Синтаксис команды RESET.
На выбор данных, записываемых в журнал, влияют следующие настройки mysqld:
Опция | Описание |
binlog-do-db=database_name | |
Указывает головному серверу что он должен журналировать обновления в двоичный журнал если текущая (т.е. выбранная) база данных - это 'database_name'. Остальные базы данных, особо не отмеченные, игнорируются. Имейте в виду, что если вы используете эту опцию, то вам следует делать обновления только в этой базе данных. (пример: binlog-do-db=some_database)
binlog-ignore-db=database_name | |
Заставляет master отказаться от занесения в журнал обновлений определенной базы данных (пример: binlog-ignore-db=some_database)
Чтобы была возможность определить, какие файлы журналов используются в данный момент, mysqld создает и индексный файл, содержащий имена всех находящихся в работе файлов. По умолчанию ему присваивается то же имя, что и файлу журнала, но с расширением .index. Имя этого файла можно изменить с помощью параметра --log-bin-index=[filename].
При использовании репликации удалять старые файлы журналов не стоит до тех пор, пока вы не будете уверены в том, что они никогда не понадобятся ни одной зависимой базе. Добиться такого результата можно, запуская команду mysqladmin flush-logs раз в день и затем удаляя все журналы, созданные более 3 дней назад.
Работать с файлами бинарного журнала можно с помощью программы mysqlbinlog. Обновить MySQL в соответствии с записями в журнале можно так:
shell> mysqlbinlog log-file | mysql -h server_name
С помощью программы mysqlbinlog можно даже считывать файлы журнала прямо с удаленного сервера MySQL!
При запуске mysqlbinlog с ключом --help на экран выводится дополнительная информация по работе с этой программой.
При работе с настройками BEGIN [WORK] или SET AUTOCOMMIT=0 для резервного копирования нужно использовать бинарный журнал, а не старый журнал обновлений.
Занесение данных в бинарный журнал происходит сразу по завершении исполнения запроса, но до снятия блокировок. Таким образом обеспечивается уверенность в том, что журнал ведется именно в порядке выполнения запросов.
Updates to non-transactional tables are stored in the binary log immediately after execution.
Обновления нетранзакционных таблиц сохраняются в двоичном журнале немедленно после выполнения. Все обновления (UPDATE, DELETE или INSERT), изменяющие данные в транзакционных таблицах (например, BDB-таблицу) находятся в кэше до вызова COMMIT. В этот момент mysqld пишет всю транзакцию целиком в двоичный журнал перед тем, как выполнить COMMIT. Каждый поток при запуске будет создавать буффер размером binlog_cache_size для буферизации запросов. Если запрос превышает этот размер, тогда поток откроет временный файл для сохранения транзакции. Временный файл будет удален при выходе потока.
При запуске каждого потока создается буфер запросов, объем которого соответствует значению параметра binlog_cache_size. Если запрос не помещается в буфере, поток создаст временный файл для кэша. Временный файл удаляется по завершении работы потока.
Параметр max_binlog_cache_size (по умолчанию 4Гб) позволяет ограничить общий объем памяти, используемой для кэширования мультитранзакционного запроса. Если транзакция больше этого - будет произведен откат.
При использовании журнала обновлений или бинарного журнала параллельные операции вставки будут преобразованы в нормальные операции вставки в командах CREATE ... SELECT и INSERT ... SELECT. Это сделано специально - для того, чтобы обеспечить возможность создания точной копии таблиц путем объединения резервной копии с журналом.
Журнал медленных запросов
При запуске с параметром --log-slow-queries[=file_name] mysqld создает файл журнала, в котором сохраняются данные обо всех командах SQL, на выполнение которых ушло больше времени, чем указано в значении параметра long_query_time. Время, уходящее на первоначальную блокировку таблиц, не включается во время исполнения запроса.
Занесение данных в журнал происходит сразу по завершении исполнения запроса и снятия блокировок. Таким образом, порядок расположения записей может отличаться от порядка выполнения запросов.
Если имя файла не задано, по умолчанию ему дается имя хоста с окончанием -slow.log. Если файлу присвоено имя, не содержащее пути доступа к нему, этот файл сохраняется в каталоге с данными.
Этот журнал позволяет определить запросы, на выполнение которых ушло слишком много времени, а, значит, и обнаружить основных кандидатов на оптимизацию. Конечно, при достижении журналом значительного объема эта задача усложняется. В таком случае журнал можно пропустить через команду mysqldumpslow и получить краткий отчет о запросах, попавших в список.
При использовании ключа --log-long-format на экран выводятся и запросы, не работающие с индексами (see section 4.1.1 Параметры командной строки mysqld).
Обслуживание файлов журналов
В MySQL предусмотрено наличие нескольких файлов журналов, позволяющих следить за всеми аспектами работы системы (see section 4.9 Файлы журналов MySQL). Правда, иногда приходится проверять, не занимают ли журналы лишнего места, и удалять ненужные.
При работе с журналами MySQL, вам, вероятнее всего, понадобится удалять их или создавать их резервные копии, и указывать MySQL записывать данные журналов в новые файлы (see section 4.4.1 Резервное копирование баз данных).
В системе Linux (Red Hat) для этого можно использовать сценарий mysql-log-rotate. При установке MySQL с дистрибутива RPM этот сценарий устанавливается автоматически. Обратите внимание: использовать журнал для репликации необходимо с максимальной аккуратностью!
В других ОС вы можете самостоятельно создать небольшой сценарий для обработки журналов, запускаемый из cron.
Заставить MySQL создать новый файл журнала можно с помощью команды mysqladmin flush-logs или SQL-команды FLUSH LOGS. При работе с MySQL версии 3.21 пользоваться можно только командой mysqladmin refresh.
Эта команда выполняет следующие действия:
Если используется стандартный журнал (--log) или журнал медленных запросов (--log-slow-queries), файл журнала (mysql.log и `hostname`-slow.log по умолчанию) закрывается и открывается вновь.
Если используется журнал обновлений (--log-update), файл журнала закрывается, после чего создается новый файл с большим номером.
При использовании одного журнала обновлений нужно очистить журналы и перенести их старые файлы в резервную копию. При использовании обычной процедуры ведения журналов для этого нужно выполнить примерно следующую последовательность команд:
shell> cd mysql-data-directory shell> mv mysql.log mysql.old shell> mysqladmin flush-logs
а затем сделать резервную копию файла mysql.old и удалить его.
Файлы журналов MySQL
В MySQL имеется несколько журналов, позволяющих узнать, что происходит внутри mysqld:
Журнал | Описание |
Журнал ошибок | В нем хранятся ошибки запуска, работы или завершения работы mysqld. |
Журнал isam | В нем хранится информация обо всех изменениях таблиц ISAM. Используется только при отладке кода isam. |
Общий журнал запросов | В нем хранится информация об установленных соединениях и выполненных запросах. |
Журнал обновлений log | В нем хранятся все команды, меняющие данные; в скором времени выйдет из употребления |
Бинарный журнал обновлений | В нем хранятся все меняющие что-либо команды. Используется для репликации |
Журнал медленных запросов | В нем хранятся все запросы, на выполнение которых ушло больше времени, чем указано в переменной long_query_time (или запросы, не использовавшие индексов). |
Все файлы журналов хранятся в каталоге с данными mysqld. С помощью команды FLUSH LOGS можно заставить mysqld открыть файлы журналов снова (или - в некоторых случаях - переключиться на новый файл). See section 4.5.3 Синтаксис команды FLUSH.
Введение
К числу преимуществ, которые обеспечивает репликация, относится повышение скорости и надежности. Чтобы обеспечить надежность, можно установить две системы и при возникновении проблем с головным сервером переключаться на резервную копию. Для увеличения скорости можно перенаправлять те запросы, которые не обновляют данные, на сервер с копиями. Разумеется, это даст эффект лишь в том случае, если запросы, не обновляющие данные, преобладают, но, как правило, чаще всего так и бывает.
MySQL, начиная с версии 3.23.15, поддерживает односторонний внутренний механизм репликации. Один сервер действует как головной, а другие - как подчиненные. Обратите внимание: один сервер может играть роль головного в одной паре и подчиненного - в другой. Головной сервер содержит двоичный журнал обновлений (see section 4.9.4 Бинарный журнал обновлений) и индексный файл двоичных журналов для протоколирования ротации двоичных журналов. Подчиненный сервер при соединении уведомляет головной о том, в каком состоянии он находится, начиная от последнего обновления, которое было успешно опубликовано на подчиненный сервер. После этого подчиненный сервер принимает обновления, а затем блокируется и ждет, пока головной сервер не сообщит о новых обновлениях.
Обратите внимание: при реплицировании базы данных все обновления этой базы данных должны производиться через головной сервер!
Еще одно преимущество использования механизма репликации заключается в том, что можно иметь "живую" резервную копию системы, выполняя резервное копирование не на головном, а на подчиненном сервере (see section 4.4.1 Резервное копирование баз данных).
Как реализована репликация: обзор
Репликация в MySQL основывается на том, что все изменения базы данных (обновления, удаления и т.д.) протоколируются в двоичном журнале на сервере (see section 4.9.4 Бинарный журнал обновлений), а подчиненный сервер читает сохраненные запросы из двоичного журнала головного сервера и выполняет эти запросы на своей копии данных.
Очень важно понимать, что двоичный журнал - это просто запись, начатая с фиксированного момента времени (с момента, когда вы включаете ведение записей в двоичном журнале). При установке каждого из подчиненных серверов нужно будет скопировать с головного сервера все данные, существовавшие на нем к моменту начала ведения записей в двоичном журнале. Если подчиненный сервер будет запущен с данными, не соответствующими тем, которые содержались на головном сервере к моменту запуска двоичного журнала, на подчиненном сервере может произойти сбой.
В следующей таблице вы найдете информацию о совместимости головных и подчиненных серверов разных версий. С учетом версии 4.0, мы рекомендуем использовать одну и ту же версию на обеих серверах, подчиненном и головном.
| | Головной | Головной | Головной | Головной |
| | 3.23.33 и новее | 4.0.0 | 4.0.1 | 4.0.3 и новее |
Подчиненный | 3.23.33 и новее | да | нет | нет | нет |
Подчиненный | 4.0.0 | нет | да | нет | нет |
Подчиненный | 4.0.1 | да | нет | да | нет |
Подчиненный | 4.0.3 и новее | да | нет | нет | да |
Note: MySQL 4.0.2 не рекомендован для репликации.
Начиная с версии 4.0.0 для записи данных на подчиненный сервер можно использовать команду LOAD DATA FROM MASTER. Учтите, что команда LOAD DATA FROM MASTER в настоящее время работает только если все таблицы на головном сервере имеют тип MyISAM, и для них будет установлена глобальная блокировка чтения, чтобы не допустить никаких записей во время передачи таблиц от головного сервера к подчиненному. Данное ограничение носит временный характер. Оно обусловлено тем, что мы еще не реализовали горячее резервное копирование таблиц без блокировок. Это ограничение мы снимем для следующих ветвей версии 4.0 - как только будет реализовано горячее резервное копирование, которое позволит команде LOAD DATA FROM MASTER работать без блокирования обновлений на головном сервере.
Из- за вышеупомянутого ограничения рекомендуется использовать команду LOAD DATA FROM MASTER только в тех случаях, если набор данных на головном сервере относительно невелик или если для головного сервера допустима длительная блокировка чтения. Скорость выполнения команды LOAD DATA FROM MASTER для разных систем может быть различной, поэтому для грубой оценки времени выполнения команды можно считать, что для передачи 1 Мб данных требуется 1 секунда. Это приблизительно соответствует случаю, когда и головной, и подчиненный серверы эквивалентны Pentium с тактовой частотой 700 МГц и связаны сетью с пропускной способностью 100 Мбит/с, а размер индексного файла равен примерно половине размера файла данных. Разумеется, такая прикидка дает лишь грубую приближенную оценку и в случае каждой конкретной системы потребуются свои допущения.
После того как подчиненный сервер будут правильно сконфигурирован и запущен, он должен легко соединиться с головным сервером и ожидать обработки обновлений. Если головной сервер завершит работу или подчиненный сервер потеряет связь с головным, подчиненный сервер будет пытаться установить соединение каждый раз по истечении интервала времени, указанного в опции master-connect-retry (в секундах) до тех пор, пока не установится подсоединение и не продолжится прослушивание обновлений.
Каждый подчиненный сервер отслеживает события с момента разрыва. Головной сервер не имеет никакой информации о том, сколько существует подчиненных серверов, и какие из них обновлены последними данными в любой момент времени.
В следующем разделе процесс установки головного/подчиненного серверов рассматривается более подробно.
Как настроить репликацию
Здесь кратко описано как настроить полную репликацию вашего MySQL-сервера. Предполагается, что реплицироваться будут все базы данных и репликация ранее не настраивалась. Для того чтобы выполнить указанные здесь действия, вам придется на короткое время остановить головной сервер.
Это самый простой способ установки подчиненного сервера, однако он не единственный. Например, если уже имеется образ головного сервера, на головном сервере уже установлен ID сервера и производятся записи в журнал, подчиненный сервер можно установить, не останавливая головной сервер и даже не устанавливая блокировки обновлений (за дополнительной информацией обращайтесь к разделу See section 4.10.7 Часто задаваемые вопросы по репликации.
Чтобы стать настоящим гуру по репликации в MySQL, советуем сначала изучить, осмыслить и опробовать все команды, упомянутые в разделе See section 4.10.6 SQL-команды, относящиеся к репликации. Необходимо также ознакомиться с опциями запуска репликации из файла `my.cnf' в разделе See section 4.10.5 Опции репликации в файле `my.cnf'.
Удостоверьтесь, что на головном и подчиненном(ых) серверах установлена свежая версия MySQL. Используйте версию 3.23.29 или выше. В предыдущих релизах применялся другой формат двоичного журнала и содержались ошибки, которые были исправлены в более новых релизах. Большая просьба: пожалуйста, не посылайте сообщения об ошибках, не проверив, присутствует ли эта ошибка в последнем релизе.
Установите на головном сервере отдельного пользователя для репликации с привилегией FILE (в версиях MySQL ниже 4.0.2) или REPLICATION SLAVE в более новых версиях MySQL. У этого пользователя должно быть также разрешение подсоединяться со всех подчиненных серверов. Если пользователь будет выполнять только репликацию (рекомендуется), то ему не нужно предоставлять какие-либо дополнительные привилегии. Например, чтобы создать пользователя с именем repl, который может иметь доступ к головному серверу с любого хоста, можно использовать такую команду:
mysql> GRANT FILE ON *.* TO repl@"%" IDENTIFIED BY ''; # головной < 4.0.2
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@"%" IDENTIFIED BY ''; # головной >= 4.0.2
Если вы планируете использовать LOAD TABLE FROM MASTER или LOAD DATA FROM MASTER (доступные с версии 4.0.0), вам также надо выделить привилегии RELOAD и SUPER на головном сервере для вышеуказанного пользователя.
Если вы используете MyISAM-таблицы, сохраните содержимое и заблокируйте модифицирующие запросы командой FLUSH TABLES WITH READ LOCK.
mysql> FLUSH TABLES WITH READ LOCK;
и после этого - снимите образ данных на вашем головном сервере.
Легче всего сделать это (на Unix), создав при помощи tar архив всей своей директории данных. Точное местоположение директории данных зависит от вашей инсталляции.
tar -cvf /tmp/mysql-snapshot.tar /path/to/data-dir
Пользователи Windows для создания архива каталога данных могут использовать WinZIP или другую подобную программу.
После того как снимок будет или прямо во время этого процесса, узнайте значения: имя текущего двоичного журнала и позицию на головном сервере:
mysql > SHOW MASTER STATUS; +---------------+----------+--------------+-------------------------------+ | File | Position | Binlog_do_db | Binlog_ignore_db | +---------------+----------+--------------+-------------------------------+ | mysql-bin.003 | 73 | test,bar | foo,manual,sasha_likes_to_run | +---------------+----------+--------------+-------------------------------+ 1 row in set (0.06 sec)
Столбец File дает имя журнала, Position дает информацию о смещении в журнале (позиции). В этом примере имя журнала - mysql-bin.003 и смещение - 73. Запишите эти значения - они вам понадобятся чуть позже, когда будете настраивать подчиненный сервер.
Когда вы получили образ и сохранили указанную информацию, вы можете снова разрешить запись в таблицы на головном сервере:
mysql> UNLOCK TABLES;
Если вы используете таблицы InnoDB, то в идеале было бы хорошо, чтобы вы использовали ПО InnoDB Hot Backup. Она берет целостный снимок без установки каких-либо блокировок на головном сервере, и сохраняет имя журнала и позицию непосредственно в снимке, что позволит в дальнейшем использовать эту информацию на подчиненном сервере. Более подробная информация об этой программе доступна на http://www.innodb.com/hotbackup.html.
Без использования этой утилиты, наиболее быстрый способ получить снимок таблиц InnoDB - это остановить головной сервер и скопировать файлы данных, журналы, и файлы определений формата таблицы (`.frm'). Для сохранения текущего имени файла журнала и смещения, вам следует выполнить следующее перед остановкой сервера:
mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS;
И затем сохраните имя журнала и смещение из вывода команды SHOW MASTER STATUS так, как было показано выше. После этого остановите сервер без снятия блокировок с таблиц. Это нужно сделать именно так, чтобы быть уверенным, что сервер остановится именно с тем снимком, который мы сделали:
shell> mysqladmin -uroot shutdown
Если головной сервер был ранее запущен без опции log-bin, то значения имени файла журнала и позиции будут пустыми в выводе SHOW MASTER STATUS. В этом случае, сохраните пустую строку ('') как имя файла журнала и 4 как позицию.
В `my.cnf' на головном сервере добавьте к разделу [mysqld] записи log-bin и server-id=уникальный номер и перезапустите сервер. Очень важно, чтобы номер подчиненного сервера отличался от номера головного сервера. Можно считать, что server-id играет роль IP-адреса - он уникально идентифицирует сервер среди участников репликации.
[mysqld] log-bin server-id=1
Добавьте в my.cnf на подчиненном сервере(ах) следующий фрагмент:
server-id=
заменяя значения в <> значениями, соответствующими вашей системе. Значения server-id должны быть различными на каждом сервере, участвующем в репликации. Если значение server-id не определено, оно будет установлено в 1, если также не определено значение master-host, оно будет установлено в 2. Обратите внимание, что если значение server-id опущено, то головной сервер будет отказывать в соединении всем подчиненным серверам, а подчиненный сервер - отказывать в соединении головному серверу. Таким образом, опускать установку значения server-id можно лишь в случае резервного копирования с использованием двоичного журнала.
Когда подчиненный сервер будет работать, заставьте его забыть старую конфигурацию репликации, если он использовался в репликации раньше:
mysql> RESET SLAVE;
Скопируйте данные снимка в директорию данных на подчиненном сервере (ах). Удостоверьтесь в правильности привилегий для файлов и каталогов. Пользователь, от имени которого запускается MySQL, должен иметь возможность читать и записывать данные в них так же, как и на головном сервере.
Перезапустите подчиненный(ые) сервер(ы).
Когда подчиненные сервера запустятся, выполните:
mysql> CHANGE MASTER TO MASTER_HOST='', MASTER_USER='', MASTER_PASSWORD='', MASTER_LOG_FILE='', MASTER_LOG_POS=;
заменяя значения в <> значениями, соответствующими вашей системе.
Запустите поток подчиненного сервера:
mysql> SLAVE START;
После выполнения указанных действий подчиненный(ые) сервер(ы) должен(ы) подсоединиться к головному серверу и подгонять свои данные под любые изменения, произошедшие на головном сервере после принятия образа.
Если не установлен идентификатор server-id для подчиненного сервера, в журнальный файл регистрации ошибок будет внесена следующая ошибка:
Warning: one should set server_id to a non-0 value if master_host is set. The server will not act as a slave.
(Предупреждение: если задан master_host, следует установить server_id в ненулевое значение. Сервер не будет работать как подчиненный сервер.)
Если не установлен идентификатор головного сервера, подчиненные серверы не смогут подключиться к головному серверу.
Если подчиненный сервер по какой-либо причине не может выполнять репликацию, соответствующие сообщения об ошибках можно найти в журнале регистрации ошибок на подчиненном сервере.
После того как подчиненный сервер начнет выполнять репликацию, в той же директории, где находится журнал регистрации ошибок, появится файл `master.info'. Файл `master.info' используется подчиненным сервером для отслеживания того, какие записи двоичных журналов головного сервера обработаны. Не удаляйте и не редактируйте этот файл, если не уверены в том, что это необходимо. Даже если такая уверенность есть, все равно лучше использовать команду CHANGE MASTER TO.
На данном этапе у вас есть снимок, который вы можете использовать для настройки и установки других подчиненных серверов. Чтобы сделать это, вам надо повторить вышеописанную процедуру в части настройки подчиненного сервера. Вам не нужно создавать еще один снимок головного сервера.
Возможности репликации и известные проблемы
Ниже приводится список поддерживаемых и не поддерживаемых при репликации функций:
Реплицирование будет выполнено правильно при использовании значений AUTO_INCREMENT, LAST_INSERT_ID() и TIMESTAMP.
Если в обновлениях присутствует функция RAND(), реплицирование будет выполнено некорректно. При реплицировании обновлений с функцией RAND() применяйте RAND(some_non_rand_expr). В качестве аргумента (some_non_rand_expr - некоторое не случайное выражение) для функции RAND() можно, например, использовать функцию UNIX_TIMESTAMP().
На головном и подчиненном серверах следует использовать одинаковый набор символов (--default-character-set). В противном случае могут возникать ошибки дублирующихся ключей на подчиненном сервере, поскольку ключ, который считается уникальным на головном сервере, может не быть таковым при использовании другого набора символов.
В MySQL 3.23 команда LOAD DATA INFILE будет выполнена корректно, если файл во время выполнения обновления будет находиться на головном сервере. Команда LOAD LOCAL DATA INFILE будет проигнорирована. В MySQL 4.0 это ограничение не присутствует - все разновидности команды LOAD DATA INFILE реплицируются правильно.
Запросы на обновление, в которых используются пользовательские переменные, являются не безопасными для репликации (пока).
Команды FLUSH не записываются в двоичный журнал и поэтому не копируются на подчиненный сервер. Проблем при этом не возникает, поскольку команды FLUSH ничего не изменяют. Однако это означает, что при непосредственном, без использования оператора GRANT, обновлении таблиц привилегий MySQL и при последующем реплицировании базы данных привилегий mysql нужно выполнить команду FLUSH PRIVILEGES на подчиненных серверах, чтобы новые привилегии вступили в силу.
Временные таблицы, начиная с версии 3.23.29, реплицируются корректно, за исключением случая, когда при прекращении работы подчиненного сервера (не только потока подчиненного сервера) некоторые временные таблицы остаются открытыми и используются в последующих обновлениях. Для решения этой проблемы перед прекращением работы подчиненного сервера выполните команду SLAVE STOP, проверьте, чтобы переменная Slave_open_temp_tables содержала значение 0, затем выполните mysqladmin shutdown. Если значение переменной Slave_open_temp_tables
не 0, перезапустите поток подчиненного сервера при помощи команды SLAVE START и проверьте, не улучшилась ли ситуация теперь. Эта проблема будет решаться более изящно, но придется подождать MySQL 4.0. В более ранних версиях при использовании временных таблиц репликации не выполняются должным образом - в таких случаях мы рекомендуем либо обновить версию MySQL, либо перед выполнением запросов, использующих временные таблицы, выполнить команду SET SQL_LOG_BIN=0 на своих клиентах.
MySQL поддерживает лишь один головной и много подчиненных серверов. В 4.x будет добавлен алгоритм голосования, обеспечивающий автоматическое изменение головного сервера, если что-либо будет выполняться неправильно при текущем головном сервере. Будут также введены процессы 'агента', которые помогут выполнять распределение нагрузки путем посылки запросов на выборки различным подчиненным серверам.
Начиная с версии 3.23.26 стало безопасно соединять серверы циклическими соединениями головной-подчиненный с включенной опцией log-slave-updates. Однако обратите внимание: при таком способе установки многие запросы не будут выполняться корректно, если только в коде вашего клиента не предусмотрена обработка потенциальных проблем, которые могут случаться при обновлениях, происходящих в различной последовательности на различных серверах. Это означает, что если вы сделаете установку следующим образом:
A - > B > - C - > A
то такая установка будет работать только в том случае, если выполняются непротиворечивые обновления между таблицами. Другими словами, при вставке данных на серверах A и C нельзя вставлять на сервере A строку, которая может иметь ключ, противоречащий строке, вставляемой на сервере C. Также нельзя обновлять одинаковые строки на двух серверах, если имеет значение порядок обновлений. Обратите внимание: в версии 3.23.26 изменился формат журнала. Таким образом, если версия подчиненного сервера меньше 3.23.26, сервер не сможет считывать записи из журнала.
Если запрос на подчиненном сервере вызывает ошибку, поток подчиненного сервера завершится, и в файле `.err' появится соответствующее сообщение. После этого нужно будет вручную установить соединение с подчиненным сервером, исправить причину ошибки (например обращение к несуществующей таблице) и затем выполнять SQL-команду SLAVE START (доступна в версии 3.23.16). При использовании версии 3.23.15 потребуется перезапустить сервер.
Если соединение с головным сервером прервется, подчиненный сервер попытается сразу же восстановить его, и затем в случае неудачи будет повторять попытки через установленное в опции master-connect-retry количество секунд (по умолчанию 60). По этой причине безопасно выключить головной сервер и после этого перезапустить его через некоторое время. Подчиненный сервер будет также разрешать проблемы, возникающие при аварийных отключениях электричества в узлах сети.
Завершение работы подчиненного сервера (корректное) также является безопасным, поскольку при этом отслеживаются события начиная от момента остановки сервера. Но в случае некорректного отключения сервера могут возникать проблемы, особенно, если дисковый кэш не был синхронизирован перед ``смертью'' системы. Для того чтобы значительно повысить эффективность своей системы обеспечения отказоустойчивости, целесообразно приобрести хороший UPS (источник бесперебойного питания).
Если головной сервер слушает нестандартный порт, это нужно будет указать также в параметре master-port в файле `my.cnf'.
В версии 3.23.15 все таблицы и базы данных могут быть реплицированы. Начиная с версии 3.23.16 появилась возможность ограничить репликацию набором баз данных при помощи директив replicate-do-db в файле `my.cnf'; можно также исключить набор баз данных из репликации при помощи директив replicate-ignore-db. Обратите внимание,: в версиях MySQL до 3.23.23, имелась ошибка, из-за которой команда LOAD DATA INFILE выполнялась некорректно, если она применялась к базе данных, исключенной из репликации.
Начиная с версии 3.23.16 команда SET SQL_LOG_BIN = 0 будет выключать ведение записей о репликации в журналах (двоичных) на головном сервере, а команда SET SQL_LOG_BIN = 1 - включать такое ведение записей. Для выполнения этих команд нужно иметь привилегию SUPER (в MySQL 4.0.2 и выше) или PROCESS (в более ранних версиях MySQL).
Начиная с версии 3.23.19 можно убрать мусор, оставшийся после неоконченной репликации (если ее выполнение пошло не должным образом), и начать все сначала, используя команды FLUSH MASTER и FLUSH SLAVE. В версии 3.23.26 эти команды переименованы в RESET MASTER и RESET SLAVE соответственно - чтобы сделать понятным их назначение. Тем не менее, старые варианты FLUSH все еще работают - для обеспечения совместимости.
Начиная с версии 3.23. 23 можно заменять головные серверы и корректировать точку положения в журнале репликации при помощи команды CHANGE MASTER TO.
Начиная с версии 3.23.23 можно при помощи опции binlog-ignore-db уведомлять головной сервер о том, что обновления в некоторых базах данных не должны отражаться в двоичном журнале.
Начиная с версии 3.23.26, можно использовать опцию replicate-rewrite-db для уведомления подчиненного сервера о том, что он должен применить обновления базы данных на головном сервере к базе данных с другим именем на подчиненном сервере.
Начиная с версии 3.23.28 можно использовать команду PURGE MASTER LOGS TO 'имя-журнала', чтобы избавиться от старых журналов без завершения работы подчиненного сервера. Это удалит все журналы до, но не включая log-name.
Из-за того, что по своей природе таблицы MyISAM являются нетранзакционными, может случиться так, что запрос обновит таблицу только частично и возвратит код ошибки. Это может произойти, например, при вставке нескольких строк, одна из которых нарушает ограничение ключа, или в случае, когда длинный запрос обновления ``убивается'' после обновления некоторых строк. Если такое случится на головном сервере, поток подчиненного сервера завершит работу и будет ждать, пока администратор базы данных не примет решение о том, что делать в этом случае (если только код ошибки не является легитимным и в результате выполнения запроса не будет сгенерирована ошибка с тем же кодом). Если такой способ проверки правильности кода ошибки нежелателен, начиная с версии 3.23.47, некоторые (или все) ошибки могут быть замаскированы при помощи опции slave-skip-errors.
Отдельные таблицы могут исключаться из репликации при помощи опции replicate-do-table/replicate-ignore-tab или опции replicate-wild-do-table/replicate-wild-ignore-table. Однако в настоящее время наличие определенных конструктивных неточностей в некоторых довольно редких случаях может приводить к неожиданным результатам. Протокол репликации явно не уведомляет подчиненный сервер о том, какие таблицы должны быть изменены запросом, поэтому подчиненному серверу требуется анализировать запрос, чтобы узнать это. Чтобы избежать лишнего синтаксического анализа, для которого требуется прерывать выполнение запросов, исключение таблицы в настоящее время реализуется путем посылки запроса к стандартному анализатору MySQL для упрощенного синтаксического анализа. Если анализатор обнаружит, что таблица должна игнорироваться, выполнение запроса будет остановлено и выдано сообщение об успехе. Этот подход несколько неэффективен, при его применении чаще возникают ошибки и, кроме того, имеются две известные ошибки в версии 3.23.49. Первая может возникнуть из-за того, что поскольку анализатор автоматически открывает таблицу при анализе некоторых запросов, игнорируемая таблица должна существовать на подчиненном сервере. Другая ошибка заключается в том, что при частичном обновлении игнорируемой таблицы поток подчиненного сервера не заметит, что таблица должна игнорироваться, и приостановит процесс репликации. Несмотря на то что вышеупомянутые ошибки концептуально очень просто исправить, для этого придется изменить достаточно много кода, что поставит под угрозу состояние стабильности ветви 3.23. Если описанные случаи непосредственно имеют отношение к вашему приложению (а это довольно редкий случай) - используйте опцию slave-skip-errors, чтобы дать указание серверу продолжать репликации, игнорируя эти ошибки.
Опции репликации в файле `my.cnf'
Для использования репликации рекомендуется MySQL 3.23.33 или выше. С более ранними версиями тоже можно работать, но в них имеются ошибки и отсутствуют некоторые возможности. Если у вас не самая последняя версия MySQL, то в ней может не оказаться некоторых из упомянутых в данном разделе опций. Все опции, появившиеся в ветви 4.0, сопровождаются примечанием, в котором это указано. В противном случае, если интересующая вас опция не присутствует в версии 3.23, но действительно необходима, пожалуйста, замените версию на самую новую ветвь 3.23.
Не следует забывать о том, что ветвь 4.0 все еще находится в стадии альфа-разработки, поэтому некоторые функции могут работать не так гладко, как хотелось бы. Новые возможности, появившиеся в 4.0, рекомендуется использовать так, чтобы в случае возникновения проблемы не нарушилась работа приложения.
Как на головном, так и на подчиненном серверах нужно использовать опцию server-id. Она устанавливает уникальный идентификатор репликации. Нужно выбрать уникальное значение из диапазона от 1 до 2^32-1 для каждого головного и подчиненного сервера, например: server-id=3
В следующей таблице представлены опции, которые можно использовать для головного сервера.
Опция | Описание |
log-bin=filename | |
Указывает местоположение двоичного журнала обновлений, в котором будут вестись записи. Обратите внимание: если передаваемый параметр имеет расширение (например log-bin=/mysql/logs/replication.log), то в случае вызова команды FLUSH LOGS версии MySQL ниже 3.23.24 не будут правильно работать во время репликации. Эта проблема устранена в версии 3.23.25. Теперь, если используется такой способ определения имени журнала, команда FLUSH LOGS
для двоичных журналов будет игнорироваться. Для очистки журнала выполните команду FLUSH MASTER и не забудьте запустить команду FLUSH SLAVE
на всех подчиненных серверах. В версии 3.23.26 или выше нужно использовать для этого команды RESET MASTER и RESET SLAVE Вы можете использовать эту опци. если вы хотите иметь имя, которое будет независимо от имени хоста (может быть полезно, скажем, если вы переименуете ваш сервер в один прекрасный день).
log-bin-index=filename | |
Так как пользователь может выполнять команду FLUSH LOG, нужно знать, какой журнал является активным в настоящее время, а также какие журналы использовались ранее и в какой последовательности они сменялись. Эта информация сохранена в индексном файле двоичного журнала, имя которого по умолчанию `имя_хоста.index'. Имя и содержимое данного файла не следует изменять.
Пример: log-bin-index=db.index
sql-bin-update-same | |
Если включена данная опция, то при установке значения переменной SQL_LOG_BIN
это же значение будет автоматически установлено и для переменной SQL_LOG_UPDATE, и наоборот.
binlog-do-db=database_name | |
Указывает головному серверу, что он должен вести записи об обновлениях в двоичном журнале, если текущая база данных - database_name. Все другие базы данных игнорируются. Обратите внимание: при использовании этой опции вы должны быть уверены, что обновления будут производиться только в текущей базе данных.
Пример: binlog-do-db=sales
binlog-ignore-db=database_name | |
Указывает головному серверу, что если текущая база данных - database_name, то записи об обновлениях не должны вестись в двоичном журнале. Обратите внимание: при использовании этой опции вы должны быть уверены, что обновления будут производиться только в текущей базе данных.
Пример: binlog-ignore-db=accounting
В следующей таблице представлены опции, которые можно использовать для подчиненного сервера:
Опция | Описание |
master-host=host | |
Имя хоста головного сервера или IP-адрес для репликации. Если значение этой опции не установлено, поток подчиненного сервера не будет запущен. Обратите внимание: установка master-host будет игнорироваться, если существует корректный файл `master.info'. Возможно, лучше было бы назвать эти опции как-нибудь иначе, что-то вроде bootstrap-master-host, но менять их имена уже поздно.
Пример: master-host=db-master.mycompany.com
master-user=username | |
Имя пользователя, которое подчиненный сервер будет использовать для аутентификации при подсоединении к головному серверу. Пользователь должен иметь привилегию FILE. Если пользователь головного сервера не установлен, будет использовано имя пользователя test. Если удастся считать значение из файла `master.info', то оно будет иметь больший приоритет.
Пример: master-user=scott
master-password=password | |
Пароль, который будет использоваться при подсоединении подчиненного сервера к головному серверу. Если этот пароль не установлен, будет использоваться пустой пароль. Если удастся считать значение из файла `master.info,' то оно будет иметь больший приоритет.
Пример: master-password=tiger
master-port=portnumber | |
Порт, который слушает головной сервер. Если не он не установлен, используется откомпилированная установка MYSQL_PORT. Это должно быть значение 3306, если оно не было изменено при помощи опций configure. Если удастся считать значение из файла `master.info', то оно будет иметь больший приоритет
Пример: master-port=3306
master-connect-retry=seconds | |
Время ожидания в секундах для потока подчиненного сервера перед повторением попытки установить связь с головным сервером в случае прекращения работы головного сервера или потери связи. По умолчанию - 60.
Пример: master-connect-retry=60
master-ssl | |
Доступна для версий выше 4.0.0. Включает SSL для репликации. Это относительно новая опция, поэтому применять ее следует осторожно.
Пример: master-ssl
master-ssl-key | |
Доступна для версий выше 4.0.0. Имя файла-ключа SSL на головном сервере. Используется только в том случае, если включена опция master-ssl.
Пример: master-ssl-key=SSL/master-key.pem
master-ssl-cert | |
Доступна для версий выше 4.0.0. Имя файла-сертификата SSL. Используется только в том случае, если включена опция master-ssl.
Пример: master-ssl-key=SSL/master-cert.pem
master-info-file=filename | |
Местоположение файла, в который записывается информация о том, где на головном сервере произошла остановка во время выполнения репликации. По умолчанию это файл `master.info' в директории данных. Изменять это местоположение нет необходимости.
Пример: master-info-file=master.info
report-host | |
Доступна для версий выше 4.0.0. Имя хоста или IP-адрес подчиненного сервера, который передается головному серверу во время регистрации подчиненного сервера. Может быть выведен командой SHOW SLAVE HOSTS. Не устанавливайте эту опцию, если не хотите, чтобы подчиненный сервер регистрировался на головном сервере. Обратите внимание: для того, чтобы головной сервер установил соединение с подчиненным сервером, ему недостаточно просто получить IP-адрес подчиненного сервера из соединения. Из-за NAT и других проблем маршрутизации IP-адрес может быть недопустимым для подсоединения головного сервера или других хостов к подчиненному серверу.
Пример: report-host=slave1.mycompany.com
Доступна для версий выше 4.0.0. Порт для соединения с подчиненным сервером, имя хоста или IP-адрес которого были переданы головному серверу при регистрации подчиненного сервера. Порт нужно устанавливать лишь в том случае, когда подчиненный сервер слушает порт, который задан не по умолчанию, или если имеется специальный тоннель от головного сервера или других клиентов к подчиненному серверу. Не используйте эту опцию, если не уверены в своих действиях.
replicate-do-table=db_name.table_name | |
Сообщает подчиненному серверу, что он должен реплицировать только указанную таблицу. Для указания более чем одной таблицы директиву следует использовать несколько раз, по одному разу для каждой таблицы. В отличие от replicate-do-db, данную опцию можно применять для обновлений, в которых используется несколько баз данных.
Пример: replicate-do-table=some_db.some_table
replicate-ignore-table=db_name.table_name | |
Указывает подчиненному серверу, что команды, обновляющие эту таблицу, не должны реплицироваться. Для указания более чем одной таблицы директиву следует задавать несколько раз, по одному разу для каждой таблицы. В отличие от replicate-do-db, данную опцию можно применять для обновлений, в которых используется несколько баз данных.
Пример: replicate-ignore-table=db_name.some_table
replicate-wild-do-table=db_name.table_name | |
Указывает подчиненному серверу, что должны реплицироваться только те запросы, где хоть одна из таблиц удовлетворяет указанном шаблону. Для указания более чем одной таблицы директиву следует задавать несколько раз, по одному разу для каждой таблицы. Данную опцию можно применять для обновлений, в которых используется несколько баз данных. Пример: при использовании replicate-wild-do-table=foo%.bar% будут реплицироваться обновления только таблиц с именами, начинающимися с ``bar'', которые находятся в базах данных, с именами, начинаются с ``foo''.
Заметьте, что если вы используете replicate-wild-do-table=foo%.% тогда это правило также распространяется и на CREATE DATABASE и на DROP DATABASE, т.е. эти два выражения также будут реплицированы если имя базы данных совпадет с шаблоном ('foo%' в этом примере; это получается из-за того, что символ % становится шаблонным).
replicate-wild-ignore-table=db_name.table_name | |
Указывает подчиненному серверу, запросы, где используется одна из перечисленных здесь таблиц, реплицироваться не должны. Для указания более чем одной подлежащей игнорированию таблицы директиву следует задавать несколько раз, по одному разу для каждой таблицы. Данную опцию можно применять для обновлений, в которых используется несколько баз данных. Например, при использовании replicate-wild-do-table=foo%.bar% не будут реплицироваться обновления всех таблиц, начинающихся на ``bar'', в базах данных, имена которых начинаются на ``foo''.
replicate-ignore-db=database_name | |
Сообщает подчиненному серверу, что не следует реплицировать ни один запрос, в котором текущая база данных - database_name. Чтобы указать более одной базы данных, директиву следует использовать несколько раз, по одному разу для каждой базы данных.
Вы не должны использовать эту директиву, если вы используете кросс-табличные обновления, и не хотите чтобы эти обновления реплицировались.
Основная причина такого поведения заключается в том, что очень трудно из самой команды понять, должен ли этот запрос реплицироваться или нет. Например, если вы используете многотабличное удаление или многотабличное обновление в MySQL 4.x, которое охватывает более чем одну базу данных. Кроме того, достаточно быстро можно проверить, является ли текущая база данных соответствующей, т.к. эта проверка выполняется только на момент соединения или смены базы данных.
Если такие обновления необходимо производить, убедитесь, что у вас установлена версия MySQL 3.23.28 или выше и используйте replicate-ignore-db=db_name.%.
Пример: replicate-ignore-db=some_db
replicate-do-db=database_name | |
Сообщает подчиненному серверу, что реплицироваться должна только указанная база данных. Чтобы указать более одной базы данных, директиву следует использовать несколько раз, по одному разу для каждой базы данных. Заметьте, что не будут реплицироваться обновления, охватывающие несколько баз данных, такие как UPDATE some_db.some_table SET foo='bar' при том, что выбрана другая база данных или не выбрана вовсе.
Если такие обновления необходимо производить, убедитесь, что у вас установлена версия MySQL 3.23.28 или выше и используйте replicate-wild-do-table=db_name.%.
Пример: replicate-do-db=some_db
log-slave-updates | |
Указывает подчиненному серверу, чтобы тот вел записи об обновлениях, происходящих на подчиненном сервере, в двоичном журнале. По умолчанию эта опция выключена. Ее следует включить, если требуется организовать подчиненные серверы в гирляндную цепь.
replicate-rewrite-db=from_name->to_name | |
Обновления производятся не в подлинную базу данных, а в базу данных с именем, указанным в опции.
Пример: replicate-rewrite-db=master_db_name->slave_db_name
slave-skip-errors= [err_code1,err_code2,... | all] | |
Доступна только в версии 3.23.47 и выше. Сообщает потоку подчиненного сервера, что он должен продолжать репликацию, если запрос возвращает ошибку, указанную в списке. Обычно при возникновении ошибки выполнение реплицирование прекращается, чтобы пользователь мог вручную исправить несоответствия в данных. Не используйте данную опцию, если вы до конца не разобрались в причинах возникновения ошибок. Если не было допущено ошибок при установке репликации, нет ошибок в клиентских программах и нет никаких ошибок непосредственно в MySQL, то прекращения работы из-за ошибки происходить не должно. Неразборчивое применение данной опции может привести к тому, что подчиненный сервер окажется безнадежно не синхронизированным с головным сервером, и вы будете тщетно ломать себе голову над тем, каким образом это случилось. Код ошибок можно получить в сообщениях об ошибках в журнале ошибок и в выводе команды SHOW SLAVE STATUS. Полный список сообщений об ошибках можно найти в файле исходного дистрибутива `Docs/mysqld_error.txt'. Можно также (но не нужно) использовать значение all (хотя этого делать настоятельно не рекомендуется) - тогда будут игнорироваться все сообщения об ошибках и за процессом переброски данных наблюдения не будет. Само собой разумеется, при использовании этой опции целостность данных ставится под угрозу. В этом случае просьба не жаловаться, если данные на подчиненном сервере не будут соответствовать данным на головном сервере, - вас предупреждали.
Пример: slave-skip-errors=1062,1053 или slave-skip-errors=all
skip-slave-start | |
Указывает компьютеру, на котором установлен подчиненный сервер, что при его запуске не должен запускаться подчиненный сервер. Пользователь может запустить его позже при помощи команды SLAVE START.
slave_compressed_protocol=# | |
Если 1, то использовать сжание в клиент/серверном протоколе связи, если оба, и сервер и клиент, поддерживают сжатие.
slave_net_timeout=# | |
Время ожидания (в секундах) дополнительных данных от головного сервера, после чего чтение будет прервано.
SQL-команды, относящиеся к репликации
Управление репликацией производится командами SQL. Ниже приводится краткое описание команд:
Команда | Описание |
SLAVE START | Запускает поток подчиненного сервера (подчиненный сервер) |
SLAVE STOP | Завершает поток подчиненного сервера. Также как и SLAVE START, этот оператор можно использовать с опциями IO_THREAD и SQL_THREAD. (подчиненный сервер) |
SET SQL_LOG_BIN=0 | Блокирует ведение записей в журналах обновлений, если пользователь имеет привилегию SUPER. В противном случае ничего не выполняет (головной сервер) |
SET SQL_LOG_BIN=1 | Отменяет блокировку ведения записей в журналах обновлений, если пользователь имеет привилегию SUPER. В противном случае ничего не выполняет (головной сервер) |
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=n | Пропускает последующие n событий на головном сервере. Опция допустима, если поток подчиненного сервера не запущен, в противном случае будет выдана ошибка. Полезна для восстановления после сбоев репликации. |
RESET MASTER | Удаляет все двоичные журналы, перечисленные в индексном файле, и делает индексный файл двоичных журналов пустым. Для версий ниже 3.23.26 используйте команду FLUSH SLAVE (головной сервер) |
RESET SLAVE | Заставляет подчиненный сервер "забыть" свою точку положения репликации в журналах головного сервера. Для версий ниже 3.23.26 эта команда называется FLUSH SLAVE (подчиненный сервер) |
LOAD TABLE tblname FROM MASTER | Загружает копию таблицы из головного на подчиненный сервер. Используется главным образом для отладки команды LOAD DATA FROM MASTER, но некоторые "пользователи-гурманы" могут найти ей и другие применения. Если вы относите себя к числу обычных, не отягощенных хакерскими амбициями пользователей, данную опцию применять не стоит. Требуется, чтобы у пользователя репликации, использущегося в соединении с головным сервером, присутствовали привилегии RELOAD и SUPER на головном сервере. (подчиненный сервер). |
LOAD DATA FROM MASTER | Присутствует в версиях выше 4.0.0. Создает образ головного сервера и копирует его на подчиненный сервер. Требуется, чтобы у пользователя репликации, использущегося в соединении с головным сервером, присутствовали привилегии RELOAD и SUPER на головном сервере. Обновляет значения MASTER_LOG_FILE и MASTER_LOG_POS таким образом, чтобы подчиненный сервер начинал репликацию из конкретной позиции. Будет обрабатывать ограничения таблиц и баз данных, указанные в опциях replicate-*. При этом, пока происходит создание образа, могут использоваться лишь таблицы MyISAM и требуется глобальная блокировка чтения на головном сервере. В будущем планируется обеспечить работу этой команды с таблицами InnoDB и устранить необходимость глобальной блокировки чтения при помощи интерактивного резервного копирования, не требующего блокировки. |
Заметьте, LOAD DATA FROM MASTER НЕ копирует ни одну таблицу в базе данных mysql. Это сделано для того, чтобы было легко управлять разными пользователями на головном и подчиненном серверах.
CHANGE MASTER TO master_def_list | |
Заменяет параметры головного сервера значениями, заданными в списке master_def_list, и перезапускает поток подчиненного сервера. master_def_list - это список с разделителем-запятой, содержащий значения master_def, где master_def - одно из следующих значений: MASTER_HOST, MASTER_USER, MASTER_PASSWORD, MASTER_PORT, MASTER_CONNECT_RETRY, MASTER_LOG_FILE, MASTER_LOG_POS. Например:
CHANGE MASTER TO MASTER_HOST='master2.mycompany.com', MASTER_USER='replication', MASTER_PASSWORD='bigs3cret', MASTER_PORT=3306, MASTER_LOG_FILE='master2-bin.001', MASTER_LOG_POS=4;
Следует указывать только те значения, которые подлежат изменению. Не указанные значения останутся неизменными, за исключением тех случаев, когда изменяется хост или порт. В этом случае подчиненный сервер считает, что поскольку изменяется хост или порт, головной сервер становится другим. Следовательно, старые значения и точки положения в журнале будут автоматически заменены на значение пустой строки и 0 соответственно (начальные значения). Обратите внимание: если подчиненный сервер перезапускается, он сохраняет "память" о своем последнем головном сервере. Если это нежелательно, можно перед перезапуском удалить файл `master.info' - тогда подчиненный сервер будет считывать информацию о своем головном сервере из файла `my.cnf' или из командной строки. Эта команда используется для настройки подчиненного сервера при наличии образа головного сервера, а также записей из журнала и сдвига головного сервера, которые соответствуют образу. Можно выполнить команду
CHANGE MASTER TO MASTER_LOG_FILE='log_name_on_master', MASTER_LOG_POS=log_offset_on_master
на подчиненном сервере после восстановления образа (подчиненный сервер)
SHOW MASTER STATUS | Выводит информацию о состоянии головного сервера, исходя из информации в двоичных журналах (головной сервер) |
SHOW SLAVE HOSTS | Присутствует в версии 4.0.0 и выше. Выводит список подчиненных серверов, связанных в текущее время с головным сервером (подчиненный сервер) |
SHOW SLAVE STATUS | Выводит информацию о состоянии существенных параметров потока подчиненного сервера (головной сервер) |
SHOW MASTER LOGS | Присутствует только начиная с версии 3.23.28. Выводит список двоичных журналов головного сервера. Эту команду следует использовать перед вызовом команды PURGE MASTER LOGS TO для определения того, какие из журналов можно удалить (головной сервер) |
SHOW BINLOG EVENTS [ IN 'logname' ] [ FROM pos ] [LIMIT [offset,] rows ] |
@tab Показывает события в двоичном журнале обновлений. Преимущественно применяется для тестирования/отладки, но может также использоваться и для обычных клиентов, по какой-либо причине нуждающихся в чтении содержимого двоичных журналов (головной сервер).
SHOW NEW MASTER FOR SLAVE WITH MASTER_LOG_FILE='logfile' AND MASTER_LOG_POS=pos AND MASTER_LOG_SEQ=log_seq AND MASTER_SERVER_ID=server_id | Эта команда используется, когда подчиненному серверу, связанному с головным сервером, который, возможно, является "мертвым" или недоступным, нужно отключить репликации на другом подчиненном сервере, связанном с тем же головным сервером. Команда возвратит пересчитанные координаты репликации (имя файла журнала и позицию в нем), и вывод этой команды может использоваться в последующей команде CHANGE MASTER TO. Обычным пользователям данная команда, как правило, никогда не понадобится: она главным образом служит для внутреннего использования в отказобезопасном репликационном коде. В будущем возможны изменения синтаксиса опции, если будет найден более интуитивно понятный способ описания этой операции. |
PURGE MASTER LOGS TO 'logname' | |
Присутствует начиная с версии 3.23.28. Удаляет все журналы репликации, которые перечислены в индексном файле журналов до передаваемого журнала, и удаляет их из индексного файла журналов. Таким образом передаваемый журнал становится первым в индексном файле журналов. Пример:
PURGE MASTER LOGS TO 'mysql-bin.010'
Эта команда не выполнит никаких действий и возвратит ошибку, если имеется активный подчиненный сервер, который в текущее время читает данные из одного из журналов, который должен быть удален. Однако если имеется бездействующий подчиненный сервер и происходит удаление одного из журналов, который он хочет прочитать, то после того, как подчиненный сервер "поднимется", он станет неспособным к репликации. Команда может быть безопасно выполнена на подчиненных серверах во время процесса репликации - не нужно останавливать процесс. Сначала необходимо проверить все подчиненные серверы при помощи команды SHOW SLAVE STATUS, чтобы увидеть, какой журнал используется, затем вывести список журналов головного сервера при помощи команды SHOW MASTER LOGS, найти самый ранний журнал среди всех подчиненных серверов (если все подчиненные серверы получили последние обновления, это будет последний журнал в списке), сделать резервные копии всех журналов, которые должны быть удалены (необязательно), и очистить все до целевого журнала.
Часто задаваемые вопросы по репликации
Вопрос: Как сконфигурировать подчиненный сервер, если головной сервер уже запущен, и я не хочу его останавливать?
Ответ: Есть несколько возможностей. Если имеется резервная копия головного сервера в некоторой точке, имя двоичного журнала и сдвиг (от вывода SHOW MASTER STATUS), соответствующий образу, выполните следующие действия:
Удостоверьтесь, что подчиненному серверу назначен уникальный идентификатор.
Выполните команды CHANGE MASTER TO MASTER_HOST='master-host-name', MASTER_USER='master-user-name', MASTER_PASSWORD='master-pass', MASTER_LOG_FILE='recorded-log-name', MASTER_LOG_POS=recorded_log_pos
Выполните команду SLAVE START
Если нет резервной копии головного сервера, существует быстрый способ создать ее в той же последовательности действий:
FLUSH TABLES WITH READ LOCK
gtar zcf /tmp/backup.tar.gz /var/lib/mysql (или разновидность данной команды)
SHOW MASTER STATUS - удостоверьтесь в том что вывод этой команды сохранен - он пригодится позже
UNLOCK TABLES
После этого следуйте инструкциям для случая, когда имеется образ, имя двоичного журнала и сдвиг. Можно использовать один и тот же образ для конфигурации нескольких подчиненных серверов. Пока существуют двоичные журналы головного сервера, установить подчиненный сервер можно через несколько дней, а то и через месяц - при наличии образа головного сервера. Теоретически промежуток ожидания может быть бесконечным. На практике существуют два ограничения - дисковое пространство головного сервера, которое будет занято старыми журналами, и время, которое потребуется подчиненному серверу, чтобы догнать головной сервер.
В версии 4.0.0 и выше можно также использовать команду LOAD DATA FROM MASTER. Это удобная команда, которая создает образ, восстанавливает его на подчиненном сервере и сразу же корректирует имя журнала и сдвиг на подчиненном сервере. Именно команду LOAD DATA FROM MASTER можно рекомендовать как способ установки подчиненного сервера. Имейте в виду, однако, что при использовании данной команды чтение может быть блокировано на долгое время. В настоящее время эта команда еще не реализована настолько эффективно, как бы нам хотелось. Если имеются большие таблицы, пока лучше использовать локальный архив tar после выполнения команды FLUSH TABLES WITH READ LOCK.
В: Должен ли подчиненный сервер постоянно быть подсоединен к головному серверу?
О: Нет, не должен. Можно прекращать работу подчиненного сервера или оставлять его отсоединенным на несколько часов или даже дней, затем повторно подгонять подчиненный сервер к произошедшим обновлениям, и затем снова отсоединять или останавливать его на некоторое время. Таким образом можно, например, использовать установку "головной-подчиненный" через коммутационную связь, работающую в течение коротких периодов времени. При такой реализации, однако, нельзя гарантировать, что в какое-либо заданное время подчиненный сервер будет синхронизирован с головным сервером, если вы для этого не примете специальных мер. В будущем будет добавлена опция для блокировки головного сервера до тех пор, пока хотя бы один подчиненный сервер находится в синхронизации с ним.
В: Как заставить головной сервер блокировать обновления, пока происходит соединение с подчиненным сервером?
О: Выполните следующие команды:
Головной сервер: FLUSH TABLES WITH READ LOCK
Головной сервер: SHOW MASTER STATUS - запомните имя журнала и сдвиг
Подчиненный сервер: SELECT MASTER_POS_WAIT('recorded_log_name', recorded_log_offset) После выполнения этой команды подчиненный сервер будет синхронизирован с головным сервером
Головной сервер: UNLOCK TABLES - теперь головной сервер может продолжить обновления.
В: Почему иногда после перезапуска подчиненного сервера я вижу более одного потока Binlog_Dump на головном сервере?
О: Поток Binlog_Dump является непрерывным процессом, который обрабатывается сервером следующим способом:
Осуществляется захват обновлений.
Если не остается больше обновлений, входит в число pthread_cond_wait(), откуда его можно "пробудить", выполнив следующее обновление, или уничтожить.
После пробуждения проверяется причина пробуждения. Если нет причины прекращения цикла, цикл Binlog_dump продолжается.
При возникновении какой-либо фатальной ошибки, такой как обнаружение "мертвого" клиента, цикл прекращается.
Таким образом, если поток подчиненного сервера прекратится на подчиненном сервере, соответствующий поток Binlog_Dump на головном сервере не будет замечать этого, пока не произойдет по крайней мере одного обновления на головном сервере (или уничтожения потока), которое необходимо, чтобы пробудить его из числа pthread_cond_wait(). Тем временем подчиненный сервер может открыть другое соединение, результатом которого будет другой поток Binlog_Dump.
Эта проблема не должна присутствовать в версии 3.23.26 и более поздних версиях. В версии 3.23.26 для каждого репликационного сервера добавляется идентификатор server-id, и теперь все старые процессы-зомби на головном сервере уничтожаются при присоединении нового репликационного потока из того же самого подчиненного сервера.
В: Как прокручивать журналы репликации?
О: В версии 3.23.28 нужно использовать команду PURGE MASTER LOGS TO после определения тех журналов, которые должны быть удалены, и выборочно сделать резервные копии этих журналов. В более ранних версиях этот процесс намного более трудоемкий, и не может быть безопасно выполнен без остановки всех подчиненных серверов, если планируется повторное использование имен журналов. Нужно будет остановить потоки подчиненного сервера, отредактировать индексный файл двоичного журнала, удалить все старые журналы, перезапустить головной сервер, запустить потоки подчиненного сервера и затем удалить файлы старых журналов.
В: Как сделать апгрейд сервера во время репликации?
О: Если модернизируемая версия ниже 3.23.26, нужно лишь блокировать таблицы головного сервера, позволить подчиненному серверу подогнать обновления, затем выполнить команду FLUSH MASTER на головном сервере и команду FLUSH SLAVE на подчиненном сервере, чтобы очистить журналы, затем перезапустить новые версии на головном и подчиненном серверах. Обратите внимание: подчиненный сервер может останавливаться на некоторое время - пока головной сервер записывает в журнал все обновления, подчиненный сервер будет способен подогнать обновления как только сможет начать работу и подсоединиться к головному серверу.
В версиях выше 3.23. 26 осуществляется блокировка протокола репликации для обновлений. Таким образом можно делать апгрейд до более свежей версии 3.23 головного и подчиненного серверов динамически. Помимо этого, на головном и подчиненном серверах могут быть запущены различающиеся версии MySQL, если обе версии выше 3.23.26.
Q: Какие проблемы могут возникать при установке двухсторонней репликации?
A: В настоящее время для репликаций MySQL не поддерживается никакого протокола блокировки между головным и подчиненным сервером, который обеспечивал бы неделимость распределенных (междусерверных) обновлений. Другими словами, клиент A может делать обновления на головном сервере 1, и в это же время, перед тем, как эти обновления скопируются на головной сервер 2, клиент B может делать обновления на головном сервере 2, из-за которых обновления клиента A будут выполняться не так, как на головном сервере 1 компании. Таким образом, когда обновления, сделанные клиентом A, будут перенесены на головной сервер 2, таблицы, полученные в результате, будут отличаться от таблиц на головном сервере 1. В этом случае таблицы на двух серверах будут разными, даже если обновления, произошедшие на головном сервере 2, также будут скопированы на головной сервер 1. Отсюда следует, что не стоит соединять в цепочку два сервера двусторонней репликационной связью, если вы не уверены, что обновления будут безопасно выполняться в любом порядке, или если вы не обрабатываете каким-либо образом такие неупорядоченные обновления где-либо в клиентском коде.
Важно понять также и то, что если двухсторонний механизм репликации и повышает производительность, то не настолько, что это могло бы отразиться на обновлениях. Каждый из серверов должен выполнять такое же количество обновлений, как и один сервер, разве что уменьшатся конфликты при блокировках, потому что обновления, происходящие на другом сервере, будут сериализованы в одном потоке подчиненного сервера. Эта выгода, тем не менее, может быть компенсирована задержками в сети.
Q: Как использовать репликацию для повышения производительности системы?
A: Установите один сервер как головной и направляйте все записи к нему, а также сконфигурируйте такое количество подчиненных серверов, на какое у вас хватит средств и дискового пространства, и распределите чтение между головным сервером и подчиненными серверами. Можно также запустить подчиненные серверы с опциями --skip-bdb, --low-priority-updates и --delay-key-write=ALL, чтобы получить увеличение скорости на подчиненном сервере. В данном случае подчиненный сервер для повышения скорости будет использовать нетранзакционные таблицы MyISAM вместо таблиц BDB.
Q: Что нужно сделать, чтобы подготовить свой клиентский код для использования репликации, повышающей производительность?
A: Если та часть вашего кода, которая отвечает за доступ к базе данных, является достаточно абстрактной и модульной, преобразование ее для работы с установленной репликацией произойдет очень гладко и просто - для этого нужно лишь изменить реализацию доступа для чтения к базе данных от некоторого подчиненного сервера или головного сервера так, чтобы запись всегда производилась на головной сервер. Если же ваш код не имеет такого уровня абстракции, то установка системы репликации окажется для вас хорошей и мотивированной возможностью почистить свой код. Начните с создания библиотеки или оболочки со следующими функциями:
Safe_writer_connect()
Safe_reader_connect()
Safe_reader_query()
Safe_writer_query()
Префикс safe_ означает, что функция будет нести ответственность за обработку всех возникающих ошибок.
После этого нужно преобразовать клиентский код так, чтобы он использовал библиотеку оболочки. Вначале все это покажется лишней головной болью, но в конечном счете ваши усилия окупятся. Все приложения, построенные в соответствии с приведенной выше схемой, смогут "приобщиться" к преимуществам решения один головной/много подчиненных. Код будет гораздо легче поддерживать, а добавление опций поиска неисправностей станет тривиальным. К примеру, если вам захочется узнать, какой запрос среди многих тысяч возвращает ошибку или реализовать регистрацию продолжительности выполнения каждого запроса, то понадобится изменить всего пару функций. Если у вас уже написано много кода, то для автоматизации задачи его преобразования можно использовать написанную Монти утилиту replace, которая имеется в стандартном дистрибутиве MySQL, или написать собственный сценарий на Perl. Остается надеяться, что ваш код удовлетворяет некоторой распознаваемой схеме. В противном случае будет лучше переписать его каким-либо образом, или, по крайней мере, вручную подогнать его под схему.
Обратите внимание: имена функций, конечно же, можно использовать любые. Важно иметь унифицированный интерфейс для подключения для чтения, подсоединения для записи, выполнения чтения и выполнения записи.
Q: В каких случаях репликация MySQL может улучшить производительность системы, и насколько?
A: Механизм репликации MySQL наиболее эффективен для системы, где чтение производится часто, а запись - редко. Теоретически, используя установку один головной/много подчиненных, можно наращивать ее, добавляя подчиненные серверы, пока не исчерпается пропускная способность сети или количество обновлений не вырастет настолько, что головной сервер не сможет обрабатывать их.
Чтобы определить какое количество подчиненных серверов можно установить, прежде чем выгоды от дополнительных ресурсов не перестанут оправдывать затраты, и насколько увеличится производительность вашего сайта, нужно знать структуру запросов и опытным путем (тестированием) определить связь между производительностью чтения (количество считываний за секунду, или max_reads) и записи (max_writes) на типовом головном сервере и типовом подчиненном сервере. В приведенном примере показан достаточно упрощенный подсчет того, что можно получить, используя механизм репликации для предполагаемой системы.
Предположим, что загрузка системы состоит из 10% операций записи и 90% операций чтения, и известно что max_reads = 1200 - 2 * max_writes, или другими словами, наша система, не делая записей, может делать 1200 операций чтения за секунду, средняя скорость записи вдвое ниже, чем средняя скорость чтения, а зависимость между этими величинами линейная. Предположим, что головной сервер и подчиненный сервер имеют одинаковую мощность, и имеется N подчиненных серверов и 1 головной. Тогда для каждого сервера (головного или подчиненного) имеем:
reads = 1200 - 2 * writes (по результатам тестирования)
reads = 9 * writes / (N + 1) (операции чтения распределяются по серверам, но запись выполняются на всех серверах)
9 * writes/(N+1) + 2 * writes = 1200
writes = 1200/(2 + 9/(N+1)
Таким образом, если N = 0, что означает отсутствие репликации, система может обрабатывать 1200/11, т.е. около 109 записей в секунду (а число операций чтения, в соответствии с нашими допущениями для данной системы, будет в 9 раз больше, чем число операций записи).
Если N = 1, можно получить 184 операций записи в секунду.
Если N = 8, можно получить до 400 операций записи в секунду.
Если N = 17, то - 480 операций записи в секунду.
В конечном счете, если N приближается к бесконечности (а бюджет к минус бесконечности), можно получить около 600 записей в секунду, при этом производительность системы увеличится приблизительно в 5,5 раз. Однако при использовании лишь 8 серверов производительность уже увеличивается почти в 4 раза.
Обратите внимание: в приведенных вычислениях мы принимали, что сеть имеет неограниченную пропускную способность, и пренебрегали некоторыми другими факторами, которые могут оказаться существенными для системы. Во многих случаях такие подсчеты могут и не дать точного прогноза того, как отразится на системе добавление N подчиненных серверов. Однако определить, улучшат ли репликации производительность вашей системы, а если да, то насколько, вам помогут ответы на следующие вопросы:
Каково отношение числа операций чтения к числу операций записи в вашей системе?
Насколько увеличится количество записей, которые сможет обрабатывать один сервер, при уменьшении количества операций чтения?
Сколько подчиненных серверов можно установить при текущей пропускной способности сети?
Q: Как использовать репликацию для обеспечения избыточности и хорошей доступности?
A: С учетом сегодняшних возможностей репликации нужно будет установить головной сервер и подчиненный сервер (или несколько подчиненных серверов), и написать сценарий для мониторинга головного сервера - для определения, включен ли он, и уведомления приложения и подчиненных серверов об изменениях головного сервера в случае ошибки. Ниже приведено несколько советов:
Для уведомления подчиненного сервера об изменениях головного сервера используйте команду CHANGE MASTER TO.
Хороший способ информирования приложений о местоположении головного сервера - иметь на головном сервере динамической компонент DNS. При использовании bind для динамического обновления DNS можно применять nsupdate.
Запустите подчиненные серверы с опцией log-bin, но без log-slave-updates. Таким образом подчиненный сервер будет готов стать головным сервером после выполнения команд STOP SLAVE; RESET MASTER и CHANGE MASTER TO на других подчиненных серверах. Указание этой опции обеспечит также возможность перехвата ложных обновлений, которые могут происходить из-за ошибочной конфигурации подчиненного сервера (в идеале можно настроить права доступа таким образом, чтобы никакой клиент не мог производить обновления на подчиненном сервере иначе, чем через поток подчиненного сервера) в сочетании с ошибками в клиентских программах (они никогда не должны производить обновления на подчиненном сервере непосредственно).
В настоящее время мы работаем над интеграцией системы автоматического выбора головного сервера в MySQL, но пока эта функция не будет готова, придется создавать собственные средства контроля.
Q: Каким образом подчиненный сервер сохраняет информацию о том, где он находится на головном сервер?
A: Подчиненный сервер использует файл в каталоге данных, определенный в опции master-info-file=filename. В этом файле находится вся информация, необходимая подчиненному сервер для запроса новых обновлений. Этот файл содержит следующую информацию:
Номер строки | Описание |
1 | Имя файла двоичного журнала |
2 | Позиция в файле журнала |
3 | Удаленный компьютер (головной сервер) |
4 | Пользователь |
5 | Пароль |
6 | Порт |
7 | Интервал в секундах между соединениями |
Поиск неисправностей репликации
Если вы следовали инструкциям, но установленный механизм репликации не работает, прежде всего следует искать пользовательские ошибки. Выполните следующие проверки:
Производит ли головной сервер записи в двоичный журнал? Проверьте это при помощи команды SHOW MASTER STATUS. Если да, значение Position
будет отличным от нуля. Если нет, проверьте, запущен ли головной сервер с опцией log-bin и установлен ли server-id.
Запущен ли подчиненный сервер? Проверьте это при помощи команды SHOW SLAVE STATUS. Ответ находится в столбце Slave_running. Если нет, проверьте опции подчиненного сервера и просмотрите сообщения в журнале ошибок.
Если подчиненный сервер запущен, установил ли он соединение с головным сервером? Выполните команду SHOW PROCESSLIST, найдите поток, которому соответствует значение system user в столбце User и none в столбце Host, и проверьте столбец State. Если в нем находится значение connecting to master, проверьте привилегии для пользователя репликации на головном сервере, имя хоста головного сервера, установку DNS, посмотрите, запущен ли головной сервер в текущее время, доступен ли он для подчиненного сервера. После этого, если все окажется в порядке, просмотрите журналы ошибок.
Если подчиненный сервер был запущен, но затем остановился, посмотрите на вывод команды SHOW SLAVE STATUS и проверьте журналы ошибок. Такое обычно случается, когда некоторый запрос, успешно выполняющийся на головном сервере, не выполняется на подчиненном. Если создан корректный образ головного сервера и данные на подчиненном сервере обновлялись только через поток подчиненного сервера, этого происходить не должно. Но если все же такое случилось - значит, имеет место ошибка; как сообщить о ней, читайте ниже.
Если запрос, успешно выполняемый на головном сервере, не выполняется на подчиненном, и нельзя выполнить полную ресинхронизацию базы данных (ее стоит выполнить), попробуйте сделать следующее:
Сначала проверьте: возможно где-либо случайно оказалась ненужная запись. Разберитесь, как она оказалась там, затем удалите ее, и выполните команду SLAVE START.
Если вы проделали все, о чем написано выше, и ничего не помогло или этого сделать нельзя, попытайтесь понять, будет ли безопасно выполнить обновления вручную (если необходимо) и после этого игнорировать следующий запрос от головного сервера.
Если вы решили пропустить следующий запрос, выполните команды SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; SLAVE START; чтобы пропустить запрос, не использующий функции AUTO_INCREMENT или LAST_INSERT_ID(). В противном случае выполните команды SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2; SLAVE START. Причина того, что запросы, использующие функции AUTO_INCREMENT или LAST_INSERT_ID(), обрабатываются по-другому, заключается в том, что они создают два события в двоичном журнале головного сервера.
Если вы уверены, что подчиненный сервер был успешно запущен и синхронизирован с головным сервером, а также что обновления таблиц не производились вне потока подчиненного сервера, пришлите нам отчет об ошибке, и вам не потребуется опять повторять описанные выше уловки.
Удостоверьтесь, что вы не внесли старой ошибки при апгрейде MySQL до более новой версии.
Если ничего не помогает, просмотрите журналы ошибок. Если журналы большие, выполните команду grep -i slave /path/to/your-log.err на подчиненном сервере. Искать ошибку на головном сервере - не лучшая идея, поскольку в его журналах находятся лишь системные ошибки общего характера; если это возможно, он посылает ошибку на подчиненный сервер, когда что-либо происходит не так, как надо.
Если вы убедились, что пользовательская ошибка здесь ни при чем, однако механизм репликации по-прежнему не работает или работает нестабильно, пришло время начать работу над отчетом об ошибке. Вы должны предоставить нам столько информации, сколько нужно, чтобы отследить ошибку. Пожалуйста, уделите отчету об ошибке нужное количество времени и усилий, чтобы сделать его хорошо. В идеале мы хотели бы иметь контрольный пример в формате, который находится в каталоге `mysql-test/t/rpl*' исходного дерева. Отослав такой контрольный пример, в большинстве случаев можно рассчитывать на получение патча в течение одного-двух дней, хотя, конечно, это время может варьироваться в зависимости от множества факторов.
Еще один хороший способ проинформировать нас об ошибке - написать простую программу с легко конфигурируемыми параметрами соединения для головного и подчиненного серверов, в которой будет продемонстрирована проблема наших систем. Программа может быть написана на Perl или на C, в зависимости от того, какой язык вы знаете лучше.
Подготовив информацию об ошибке одним из двух способов, используйте утилиту mysqlbug, чтобы создать отчет об ошибке, и пошлите его по адресу bugs@lists.mysql.com. Если же вы имеете дело с фантомом - проблемой, которая имеет место, но вы по какой-либо причине не можете ее воспроизвести по желанию:
Убедитесь, что эта проблема не вызвана пользовательской ошибкой. Например, при обновлении подчиненного сервера вне потока подчиненного сервера данные будут не синхронизированы, и могут быть нарушения уникальных ключей при обновлениях. В этом случае поток подчиненного сервера остановится и будет ждать, пока таблицы не будут очищены вручную, для приведения их в синхронизированный режим.
Запустите подчиненный сервер с опциями log-slave-updates и log-bin - при этом в журнал будет заноситься информация обо всех обновлениях, происходящих на подчиненном сервере.
Сохраните все доказательства наличия ошибки перед сбросом репликации. Если у нас нет информации о проблеме, или имеется только отрывочная информация, потребуется время, чтобы найти источник проблемы. Вы должны собрать следующие "свидетельства":
Все двоичные журналы головного сервера
Весь двоичный журнал подчиненного сервера
Вывод команды SHOW MASTER STATUS на головном сервере во время
обнаружения проблемы
Вывод команды SHOW SLAVE STATUS на головном сервере во время
обнаружения проблемы
Журналы ошибок головного сервера и подчиненного сервера
Для изучения двоичных журналов используйте утилиту mysqlbinlog. Таким образом можно находить проблемные запросы, например:
mysqlbinlog -j pos_from_slave_status /path/to/log_from_slave_status | head
Собрав "свидетельства" о проблеме-фантоме, попробуйте сначала организовать их в отдельный контрольный пример. После этого сообщите о проблеме по адресу bugs@lists.mysql.com, описав эту проблему во всех подробностях.
Репликация в MySQL
В этом разделе описаны различные функциональные возможности репликации в MySQL. Он может служить справочником по опциям, используемым при репликации. Здесь будет описан механизм репликации и показано, как реализовывать репликации. В конце раздела мы дадим ответы на некоторые часто задаваемые вопросы, а также описания проблем и способы их решения.
Рекомендуем регулярно посещать наш web-сайт по адресу http://www.mysql.com/ для ознакомления с обновлениями, произошедшими в этом разделе. Механизм репликации постоянно улучшается, и руководство постоянно дополняется самой свежей информацией.