Mysql очистить кэш таблиц
Оптимизация для подобных таблиц — вынести часто изменяющиеся данные в отдельную таблицу. Например, есть таблица статей, в которой также хранятся и количество комментариев к ней. Посколько количество комментариев изменяется часто, а сама статья практически не меняется имеет смысл вынести количество комментариев в отдельную таблицу, позволяя при этом избегать частой инвалидации кеша статей.
Использование кеша запросов полностью прозрачно для клиента. Клиент не знает о том, выполнил ли MySQL запрос, или вернул его из кеша.
MySQL кеширует результаты только SELECT запросов. MySQL не кеширует запросы, результаты которых могут измениться. Например, запросы в которых используются функции, относящиеся к текущему времени (NOW(), CURDATE() и др.), к текущему соединению (CURRENT_USER(), CONNECTION_ID() и др.) и другие. Полный список таких функций можно найти в мануале. Кроме этого, MySQL не кеширует запросы, в которых есть использование пользовательских функций, хранимых процедур, выборки из баз mysql или INFORMATION_SCHEMA, выборки из таблиц, для которых определены привилегии для столбцов.
Оптимизация для запросов, использующих функции текущего времени (NOW(), CURDATE() и др.) — замена таких функций на строку с датой. Например: запрос
SELECT * FROM table WHERE create_date > NOW() — INTERVAL 1 DAY
, который не будет кешироваться можно заменить на запрос, который закешируется:
SELECT * FROM table WHERE create_date > '2009-10-14' — INTERVAL 1 DAY
Отдельно обрабатывается кеширование выборок от InnoDB таблиц. MySQL удаляет результаты выборок из кеша при любом изменении таблицы внутри транзакции (хотя мог бы не удалять до тех пор, пока транзакция не зафиксирована). Кроме этого, все выборки из этой таблицы не будут кешироваться до тех пор, пока транзакция не зафиксирована.
- Qcache_free_blocks показывает сколько свободных блоков есть в кеше;
- Qcache_total_blocks — количество занятых блоков;
- Qcache_free_memory говорит о том, сколько свободной памяти осталось в кеше;
- Qcache_hits — количество запросов, результаты которых были взяты из кеша;
- Qcache_inserts — количество запросов, которые были добавлены в кеш;
- Qcache_lowmem_prunes — количество запросов, которые были удалены из кеша из-за нехватки памяти;
- Qcache_not_cached — количество запросов, которые не были записаны в кеш из-за использования функций работы со временем и т.п.;
- Qcache_queries_in_cache — количество запросов, которые находятся в кеше.
- query_cache_type = (ON, DEMAND, OFF) — определяет включено ли кеширование или нет(ON, OFF). При использовании DEMAND кешироваться будут только запросы, в которых есть директива SQL_CACHE;
- query_cache_size — размер кеша запросов. query_cache_size = 0 отключает использование кеша;
- query_cache_limit — размер максимальной выборки, хранимой в кеше;
- query_cache_min_res_unit — минимальный размер блока, хранимого в кеше;
- query_cache_wlock_invalidate — определяет будут ли данные браться из кеша, если таблица, к которым они относятся заблокирована на чтение.
В момент начала записи MySQL не знает о размере получившейся выборки. Если записанный в кеш размер выборки больше, чем query_cache_limit, то запись прекращается и занятое место освобождается (поэтому, если вы знаете наперед, что результат выборки будет большим, рекомендуется выполнять его с директивой SQL_NO_CACHE). В случае, если MySQL кеширует несколько запросов параллельно, блоки, выделяемые для разных запросов, могут чередоваться. Кроме этого, после того, как запрос удален из кеша, освободившееся место может быть недостаточным для записи новых запросов. Это приводит к фрагментации кеша. Для дефрагментации кеша можно выполнить команду FLUSH QUERY CACHE. (FLUSH QUERY CACHE переносит все запросы, хранящиеся в кеше в его начало и помечает оставшуюся память как один свободный блок). Кроме этого уменьшить фрагментацию кеша можно правильным подбором параметра query_cache_min_res_unit.Если значение query_cache_min_res_unit небольшое, то фрагментация будет уменьшаться, однако, MySQL будет вынужден создавать больше блоков в кеше. Если значение велико, то фрагментация будет большой.
Значение query_cache_min_res_unit должно быть равно среднему размеру кешируемого значения. Его примерное значение можно вычислить по формуле query_cache_min_res_unit = (query_cache_size – Qcache_free_memory) / Qcache_queries_in_cache. Однако для сайтов, размер выборки которых сильно меняется, рекомендуется использовать query_cache_type = DEMAND и явное указание на то, что запрос должен быть закеширован директивой SQL_CACHE. Кроме этого, необходимо ограничить запись в кеш больших выборок заданием переменной query_cache_limit или директивой SQL_NO_CACHE.
Определить то, насколько фрагментирован кеш, можно по значению переменной Qcache_free_blocks. Для идеального нефрагментированного кеша значение равно единице, в худшем случае — Qcache_total_blocks / 2. Так же можно определить, что ваш кеш запросов сильно фрагментируется, если значение Qcache_lowmem_prunes постоянно возрастает при том, что значение Qcache_free_memory далеко от нуля.
Оценить эффективность использования кеша можно по формуле Qcache_hits / (Qcache_hits + Com_select). О том, какое значение является достаточным для вашего сайта решать вам. Если для запросов хранимых в кеше требуется большое время, то эффективность даже в 10% может быть полезной. Однако если эффективность использования низкая и увеличить ее не удается, то возможно, что характер нагрузки вашей системы такой, что кеш запросов вовсе не эффективен для вас. В таких случаях бывает более полезным вообще отключить кеширование запросов и использовать кеширование на стороне клиентов.
Читайте оригинал статьи на MySQL Consulting.
P.S. пишите в личку темы статей по MySQL, которые вы хотели бы прочитать.
Таблицы блокируются для использования отдельным потоком. Действие блокировок распространяется до тех пор, пока не произойдет разблокирование командой UNLOCK TABLES или соединение с блокирующим потоком не будет разорвано.
Ключевое слово READ блокирует таблицу "только чтение", при этом все остальные потоки могут читать данные из таблицы, но записывать в таблицу может только один, контролирующий поток.
Блокировки WRITE используются доля полной блокировки таблицы, когда ни один из потоков, кроме блокирующего, не может ни читать, ни записывать данные.
Каждый поток для выполнения действий без блокировки ждет до тех пор, пока эта блокировка не будет снята или не закончится время, выделенное на эту операцию. В последнем случае произойдет ошибка по timeout.
Блокировки WRITE имеют более высокий приоритет в очереди на блокировку, чем блокировки WRITE, чтобы данные были внесены без задержек. Обойти это условие можно, указав ключевое слово LOW PRIORITY.
Блокировать необходимо все таблицы, которые будут использованы; при этом необходимо использовать те же псевдонимы, которые будут использованы в запросах.
Обычно блокировки используются для внесения очень больших изменений в таблицы, в этом случае блокировки ускоряют работу и для эмуляции транзакций.
Установка опций
SET [OPTION] SQL_VALUE_OPTION=value.
SET OPTION устанавливает различные опции, которые затрагивают серверную или клиентскую часть. Любая установленная опция остается в силе до конца текущего сеанса или пока не будет изменена.
PASSWORD=PASSWORD('новый_пароль') изменяет пароль пользователя, доступна всем не анонимным пользователям.
PASSWORD FOR user = PASSWORD('новый_пароль') изменяет пароль указанному пользователю. Пользователь указывается как пользова-тель@хост.
SQL_AUTO_IS_NULL = 0 | 1 позволяет выполнить поиск последнего значения AUTO_INCREMENT с помощью конструкций вида SELECT.WHERE auto_increment_column IS NULL. Данная операция введена для поддержки программ, работающих через ODBC, например ACCESS.
AUTOCOMMIT = 0 | 1. Если установлено значение 1, то вносимые изменения будут сделаны сразу.
SQL_BIG_TABLES = 0 | 1. при опции, установленной в 1, временные таблицы создаются не в памяти, а на диске. Это немного медленнее, однако при использовании очень больших запросов в этом случае не генерируется ошибка "Tables is full".
SQL_BIG_SELECTS = 0 | 1. значение 0 позволяет MySQL останавливать запросы, требующие больше времени, чем max_join_size, иначе выполняются все запросы. По умолчанию значение установлено в 1.
SQL_BUFFER_RESULT = 0 | 1. Позволяет MySQL сбрасывать результаты запросов во временные таблицы. Это позволяет быстрее освобождать таблицы от блокировок.
SQL_LOW_PRIORITY_UPDATE = 0 | 1. При установлено значении 1 MySQL повышает приоритет запросов SELECT и LOCK TABLE READ над запросами INSERT, UPDATE, DELETE и LOCK TABLE WRITE.
SQL_SQFE_MODE = 0 | 1. Если установлено значение 1, то при попытке произвести изменение или удаление записей без использования ключей или ограничений с помощью LIMIT запрос выполнен не будет.
SQL_SELECT_LIMIT = value | DEFAULT. Максимальное число записей, возвращаемых запросом SELECT. Если в запросе указано ограничение LIMIT, будет использоваться это ограничение. По умолчанию максимальное число возвращаемых записей не ограничено.
LAST_INSERT_ID = value устанавливает значение, получаемое функцией LAST_INSERT_ID( ).
INSERT_ID = value устанавливает начальное значение полей AUTO_INCREMENT. При добавлении новых данных новые значения AUTO_INCREMENT начнут отсчитываться от этого значения.
OPTIMIZE TABLE должен использоваться, если Вы удалили большую часть таблицы, или если Вы сделали много изменений для таблицы со строками переменных длин (таблицы, которые имеют VARCHAR , BLOB или TEXT ). Удаленные записи поддерживаются в связанном списке, и при последующем использовании операций INSERT повторно применяются старые позиции записей. Вы можете использовать OPTIMIZE TABLE , чтобы освободить неиспользуемое место и дефрагментировать файл данных.
Сейчас OPTIMIZE TABLE применим только к таблицам типов MyISAM и BDB . Для таблиц типа BDB OPTIMIZE TABLE в настоящее время отображается на вызов ANALYZE TABLE . Подробности об этом вызове в разделе "4.5.2 Синтаксис ANALYZE TABLE ".
Вы можете оптимизировать и другие типы таблиц запуском mysqld с опциями --skip-new или --safe-mode , но в этом случае OPTIMIZE TABLE превратится в вызов ALTER TABLE .
- Если таблица имеет удаленные или порванные строки, ремонтирует таблицу.
- Если индексные страницы не отсортированы, сортирует их.
- Если статистика не современна (и ремонт не может быть выполнен с сортировкой индекса), модифицирует ее.
OPTIMIZE TABLE для таблиц типа MyISAM эквивалентен вызову myisamchk --quick --check-changed-tables --sort-index --analyze .
Обратите внимание, что таблица будет блокирована в течение всего времени работы команды OPTIMIZE TABLE !
Анализирует и сохраняет распределение ключей для таблицы. Во время процесса анализа таблица будет блокирована с доступом только на чтение. Это работает на таблицах типов MyISAM и BDB .
Это эквивалентно вызову myisamchk -a .
MySQL использует сохраненное распределение ключей, чтобы решить, в каком порядке таблицы должны быть соединены, когда выполняется объединение.
Команда возвращает таблицу со следующими столбцами:
Вы можете проверять сохраненное распределение ключей командой SHOW INDEX . Подробности в разделе " 4.5.5.1 Получение информации о базах данных, таблицах, столбцах и индексах ".
Если таблица не изменилась после последней команды ANALYZE TABLE , она не будет проанализирована снова.
Вы должны использовать команду FLUSH , если Вы хотите очищать внутренние кэши MySQL. Для выполнения FLUSH Вы должны иметь право RELOAD .
flush_option может быть любой из следующего списка:
Вы можете также обращаться к каждой из команд, показанных выше с помощью утилиты mysqladmin , используя команды flush-hosts , flush-logs , reload или flush-tables .
Каждое подключение к mysqld выполняется в отдельном процессе. Вы можете видеть запущенные процессы командой SHOW PROCESSLIST и уничтожать процесс командой KILL thread_id .
Если Вы имеете привилегию process , Вы можете видеть и уничтожать все процессы. Иначе Вы можете видеть и уничтожать только Ваши собственные процессы.
Вы можете также использовать команды mysqladmin processlist и mysqladmin kill , чтобы исследовать и уничтожать процессы.
При вызове KILL для процесса устанавливается флаг kill flag .
В большинстве случаев может требоваться некоторое время для того, чтобы процесс уничтожился, поскольку флаг kill flag может быть проверен только в специфических интервалах:
SHOW обеспечивает информацию относительно баз данных, таблиц, столбцов или информацию состояния сервера. Если используется часть LIKE wild , строка wild может быть строкой, которая использует групповые символы SQL `%' и `_' .
Вы можете использовать db_name.tbl_name как вариант для tbl_name FROM db_name . Эти две инструкции эквивалентны:
SHOW DATABASES вносит в список базы данных на сервере MySQL. Вы можете также получать этот список, используя команду mysqlshow .
SHOW TABLES вносит в список таблицы в заданной базе данных. Вы можете также получать этот список, используя команду mysqlshow db_name .
ОБРАТИТЕ ВНИМАНИЕ: Если пользователь не имеет привилегий для таблицы, соответствующая таблица не будет обнаруживаться в выводе SHOW TABLES или mysqlshow db_name .
SHOW OPEN TABLES вносит в список таблицы, которые являются в настоящее время открытыми в кэше таблиц. Подробнее см. раздел "5.4.6 Как MySQL открывает и закрывает таблицы". Поле Comment сообщает сколько раз таблица кэшируется ( cached ) и используется ( in_use ).
SHOW COLUMNS вносит в список столбцы в данной таблице. Если Вы определяете опцию FULL , Вы также получите привилегии, которые Вы имеете для каждого столбца. Если типы столбцов отличны от ожидаемых, они будут основаны на инструкции CREATE TABLE , заметьте, что MySQL иногда сам изменяет типы столбца.
Инструкция DESCRIBE обеспечивает информацию, подобную SHOW COLUMNS .
SHOW FIELDS является синонимом для SHOW COLUMNS , а SHOW KEYS синонимом для SHOW INDEX . Вы можете также вносить в список столбцы таблицы или индексы с помощью команд mysqlshow db_name tbl_name или mysqlshow -k db_name tbl_name .
SHOW INDEX возвращает индексную информацию в формате, который очень походит на вызов SQLStatistics в ODBC. Следующие столбцы всегда будут возвращены:
Столбец | Назначение |
Table | Имя таблицы. |
Non_unique | 0, если индекс не может содержать дубликаты. |
Key_name | Имя индекса. |
Seq_in_index | Номер последовательности столбца в индексе, начиная с 1 (не с 0!). |
Column_name | Имя столбца. |
Collation | Как столбец сортируется в индексе. В MySQL это может иметь варианты `A' (по возрастанию) или NULL (не сортируемый). |
Cardinality | Число уникальных значений в индексе. Это модифицируется запуском isamchk -a . |
Sub_part | Число индексированных символов, если столбец только частично индексирован. NULL если весь ключ индексирован в полном объеме. |
Comment | Различные замечания. Пока это сообщает, является ли индекс полнотекстовым (FULLTEXT) или нет. |
Обратите внимание, что, поскольку Cardinality будет рассчитано, основываясь на статистике, сохраненной как целые числа, оно не обязательно точно для маленьких таблиц.
SHOW TABLE STATUS (новинка в Version 3.23) работает подобно SHOW STATUS , но обеспечивает много информации относительно каждой таблицы. Вы можете также получать этот список, используя команду mysqlshow --status db_name . Следующие столбцы возвращены:
Столбец | Зачем он нужен |
Name | Имя таблицы. |
Type | Тип таблицы. Подробности в разделе "7 Типы таблиц MySQL". |
Row_format | Формат хранения строки (фиксированный, динамический или сжатый). |
Rows | Число строк. |
Avg_row_length | Средняя длина строки. |
Data_length | Длина файла данных. |
Max_data_length | Максимальная длина файла данных. |
Index_length | Длина индексного файла. |
Data_free | Число распределенных, но не используемых байт. |
Auto_increment | Следующее значение auto_increment. |
Create_time | Когда таблица была создана. |
Update_time | Когда файл данных был в последний раз модифицирован. |
Check_time | Когда таблица была в последний раз проверена на ошибки. |
Create_options | Дополнительные параметры, используемые с CREATE TABLE . |
Comment | Комментарий, используемый при создании таблицы (или информация о том, почему MySQL не может обращаться к информации по данной таблицы). |
Таблицы InnoDB сообщат свободное пространство в ней через поле комментария таблицы.
SHOW STATUS обеспечивает информацию состояния сервера (подобно mysqladmin extended-status ). Вывод походит на показанное ниже, хотя формат и числа будут другими:
Некоторые комментарии относительно вышеупомянутого:
- Если Opened_tables велико, то переменная table_cache , вероятно, слишком маленькая.
- Если key_reads велико, то переменная key_cache , вероятно, слишком маленькая. Коэффицент кэширования может быть вычислен по формуле: key_reads / key_read_requests .
- Если Handler_read_rnd велико, то Вы, вероятно, имеете много запросов, которые требуют, чтобы MySQL просматривал целые таблицы, или Вы имеете объединения, которые не используют ключи правильно.
- Если Threads_created велико, то следует увеличить переменную thread_cache_size .
SHOW VARIABLES показывает значения некоторых переменных системы MySQL. Вы можете также получить эту информацию, используя команду mysqladmin variables . Если значения по умолчанию неподходящие, Вы можете устанавливать большинство этих переменных, используя параметры командной строки mysqld . Подробности в разделе " 4.1.1 Параметры командной строки mysqld".
Вывод походит на показанное ниже, хотя формат и числа будут иными:
Каждая опция описана ниже. Значения для буферных размеров, длин и размеров стека даны в байтах. Вы можете определять значения с суффиксами `K' или `M' , чтобы указать килобайты или мегабайты. Например, 16M указывает 16 мегабайтов. Регистр символов суффикса не имеет значения: 16M и 16m эквивалентны.
ansi_mode . ON , если mysqld запущен с опцией --ansi . Подробности в разделе "1.2.3 Запуск MySQL в режиме ANSI". back_log Сколько ожидающих обработки подключений может иметь MySQL. Это важно, когда главный процесс MySQL получает ОЧЕНЬ много запросов подключения за очень короткое время. Затем требуется некоторое время (хотя очень немного) для основного процесса, чтобы проверить подключение и запустить новый поток. Значение back_log указывает, сколько запросов могут быть сложены в стек в течение этого короткого времени прежде, чем MySQL на мгновение остановит ответы на новые запросы. Вы должны увеличить это только, если Вы ожидаете большое количество подключений за короткий периоде времени (сервер работает интенсивно).
Другими словами, это значение задает размер слушающей очереди для входящих подключений TCP/IP. Ваша операционная система имеет собственное ограничение размера этой очереди. В Unix man-страница listen(2) должна иметь большее количество деталей. Проверьте документацию на Вашу ОС для выяснения максимального значения для этой переменной. Попытка устанавливать back_log выше, чем это ограничение операционной системы, будет неэффективна, хотя и безопасна. basedir Значение опции --basedir . bdb_cache_size Буфер, который распределен, чтобы кэшировать индекс и строки для BDB -таблиц. Если Вы не используете таблицы BDB , Вы должны запустить mysqld с опцией --skip-bdb , чтобы не тратить впустую память для этого кэша. bdb_log_buffer_size Буфер, который распределен, чтобы кэшировать протоколы для BDB -таблиц. Если Вы не используете таблицы BDB , Вы должны запустить mysqld с опцией --skip-bdb , чтобы не тратить впустую память для этого кэша. bdb_home Значение опции --bdb-home . bdb_max_lock Максимальное число блокировок (по умолчанию 1000), которые Вы можете иметь активным на BDB-таблице. Вы должны увеличить это значение, если Вы получаете ошибки типа bdb: Lock table is out of available locks или Got error 12 from . , когда Вы делаете длинные транзакции, или когда mysqld должен исследовать много строк, чтобы вычислить и обработать запрос. bdb_logdir Значение опции --bdb-logdir . bdb_shared_data ON , если Вы используете --bdb-shared-data . bdb_tmpdir Значение опции --bdb-tmpdir . binlog_cache_size . Размер кэша, чтобы хранить инструкции SQL для двоичного файла регистрации в течение транзакции. Если Вы часто используете большие, многооператорные транзакции, Вы можете увеличить это, чтобы получить большую эффективность. character_set Набор символов по умолчанию. character_sets Поддерживаемые наборы символов. concurrent_inserts Если ON (значение по умолчанию), MySQL позволит Вам использовать INSERT на таблицах системы MyISAM в то же самое время, когда Вы выполняете на них запросы SELECT . Вы можете выключить эту опцию запуском mysqld с параметрами --safe или --skip-new . connect_timeout Число секунд, которое сервер mysqld ждет подключения перед ответом Bad handshake . datadir Значение опции --datadir . delay_key_write Если включено (по умолчанию), MySQL учитывает опцию delay_key_write в CREATE TABLE . Это означает, что буфер ключей для таблиц с этой опцией не будет сбрасываться на каждой индексной модификации, а только когда таблица будет закрыта. Это ускорит работу по записи, но Вы должны добавить автоматическую проверку всех таблиц командой myisamchk --fast --force . Обратите внимание, что, если Вы запускаете mysqld с опцией --delay-key-write-for-all-tables , это означает, что все таблицы будут обрабатываться так, как будто они были созданы с опцией delay_key_write . Вы можете очищать этот флажок, запуская mysqld с параметрами --skip-new или --safe-mode . delayed_insert_limit После вставки delayed_insert_limit строк, драйвер INSERT DELAYED проверит, имеется ли любая задержка инструкций SELECT . Если так, это позволяет им выполниться перед продолжением работ с таблицей. delayed_insert_timeout Сколько времени поток INSERT DELAYED должен ждать инструкции INSERT перед своим завершением. delayed_queue_size Каких размеров (в строках) очередь должна быть распределена для обработки INSERT DELAYED . Если очередь заполняется, любой пользователь, который вызвал INSERT DELAYED , будет ждать до появления свободного места в очереди. flush ON , если MySQL был запущен с опцией --flush . flush_time Если это установлено в значение, отличное от нуля, то каждые flush_time секунд все таблицы будут закрыты (чтобы освободить ресурсы и сбросить данные на диск). Я рекомендую эту опцию только на Win95, Win98 или на системах, где Вы имеете очень небольшое количество ресурсов. have_bdb YES , если mysqld поддерживает таблицы Berkeley DB. DISABLED , если использован параметр --skip-bdb . have_innodb YES , если mysqld поддерживает таблицы InnoDB. DISABLED , если использован параметр --skip-innodb . have_raid YES , если mysqld поддерживает опцию RAID . have_ssl YES , если mysqld поддерживает SSL (шифрование) по протоколу клиент/сервер. init_file Имя файла, определенного в параметре --init-file при запуске сервера. Это файл инструкций SQL, которые Вы хотите всегда выполнять при каждом запуске сервера. interactive_timeout Число секунд, которое сервер ждет действий на активном подключении перед его закрытием. Интерактивный пользователь определен как пользователь, который применяет опцию CLIENT_INTERACTIVE для mysql_real_connect() . См. также wait_timeout . join_buffer_size Размер буфера, который используется для полных объединений (объединения, которые не используют индексы). Буфер будет распределен один раз для каждого полного объединения между двумя таблицами. Увеличьте это значение, чтобы ускорить полное объединение, если добавление индексов невозможно. Обычно самый лучший способ получать быстрые объединения состоит в том, чтобы добавить индексы таблицы. key_buffer_size Индексные блоки буферизированы и разделяются всеми потоками. key_buffer_size как раз и задает размер буфера, используемого для индексных блоков. Увеличьте это значение, чтобы улучшить индексную обработку. Но если Вы сделаете его слишком большим (больше, чем 50% общей памяти?), Ваша система может начать использовать своп и стать ДЕЙСТВИТЕЛЬНО медленной. Не забудьте, что поскольку MySQL не кэширует чтение данных, Вы должны оставить некоторый участок памяти для кэша файловой системы ОС.
Раздел, который описывает настройку MySQL, содержит некоторую информацию относительно того, как настроить вышеупомянутые переменные. Подробности смотрите в разделе "5.5.2 Настройка параметров сервера".
SHOW LOGS показывает Вам информацию относительно состояния существующих журналов. В настоящее время этот вызов отображает только информацию относительно журналов Berkeley DB.
- File показывает полный путь к журналу.
- Type показывает тип журнала ( BDB для журналов типа Berkeley DB).
- Status показывает состояние журнала ( FREE если файл может быть удален, или IN USE если файл необходим подсистеме транзакций).
SHOW PROCESSLIST показывает Вам, которые процессы работают. Вы можете также получать эту информацию, используя команду mysqladmin processlist . Если Вы имеете привилегию process , Вы можете видеть все процессы. Иначе Вы можете видеть только Ваши собственные процессы. Если Вы не используете опцию FULL , то только первые 100 символов каждого запроса будут показаны. Подробности в разделе "4.5.4 Синтаксис KILL ".
OPTIMIZE TABLE должен использоваться, если Вы удалили большую часть таблицы, или если Вы сделали много изменений для таблицы со строками переменных длин (таблицы, которые имеют VARCHAR , BLOB или TEXT ). Удаленные записи поддерживаются в связанном списке, и при последующем использовании операций INSERT повторно применяются старые позиции записей. Вы можете использовать OPTIMIZE TABLE , чтобы освободить неиспользуемое место и дефрагментировать файл данных.
Сейчас OPTIMIZE TABLE применим только к таблицам типов MyISAM и BDB . Для таблиц типа BDB OPTIMIZE TABLE в настоящее время отображается на вызов ANALYZE TABLE . Подробности об этом вызове в разделе "4.5.2 Синтаксис ANALYZE TABLE ".
Вы можете оптимизировать и другие типы таблиц запуском mysqld с опциями --skip-new или --safe-mode , но в этом случае OPTIMIZE TABLE превратится в вызов ALTER TABLE .
- Если таблица имеет удаленные или порванные строки, ремонтирует таблицу.
- Если индексные страницы не отсортированы, сортирует их.
- Если статистика не современна (и ремонт не может быть выполнен с сортировкой индекса), модифицирует ее.
OPTIMIZE TABLE для таблиц типа MyISAM эквивалентен вызову myisamchk --quick --check-changed-tables --sort-index --analyze .
Обратите внимание, что таблица будет блокирована в течение всего времени работы команды OPTIMIZE TABLE !
Анализирует и сохраняет распределение ключей для таблицы. Во время процесса анализа таблица будет блокирована с доступом только на чтение. Это работает на таблицах типов MyISAM и BDB .
Это эквивалентно вызову myisamchk -a .
MySQL использует сохраненное распределение ключей, чтобы решить, в каком порядке таблицы должны быть соединены, когда выполняется объединение.
Команда возвращает таблицу со следующими столбцами:
Вы можете проверять сохраненное распределение ключей командой SHOW INDEX . Подробности в разделе " 4.5.5.1 Получение информации о базах данных, таблицах, столбцах и индексах ".
Если таблица не изменилась после последней команды ANALYZE TABLE , она не будет проанализирована снова.
Вы должны использовать команду FLUSH , если Вы хотите очищать внутренние кэши MySQL. Для выполнения FLUSH Вы должны иметь право RELOAD .
flush_option может быть любой из следующего списка:
Вы можете также обращаться к каждой из команд, показанных выше с помощью утилиты mysqladmin , используя команды flush-hosts , flush-logs , reload или flush-tables .
Каждое подключение к mysqld выполняется в отдельном процессе. Вы можете видеть запущенные процессы командой SHOW PROCESSLIST и уничтожать процесс командой KILL thread_id .
Если Вы имеете привилегию process , Вы можете видеть и уничтожать все процессы. Иначе Вы можете видеть и уничтожать только Ваши собственные процессы.
Вы можете также использовать команды mysqladmin processlist и mysqladmin kill , чтобы исследовать и уничтожать процессы.
При вызове KILL для процесса устанавливается флаг kill flag .
В большинстве случаев может требоваться некоторое время для того, чтобы процесс уничтожился, поскольку флаг kill flag может быть проверен только в специфических интервалах:
SHOW обеспечивает информацию относительно баз данных, таблиц, столбцов или информацию состояния сервера. Если используется часть LIKE wild , строка wild может быть строкой, которая использует групповые символы SQL `%' и `_' .
Вы можете использовать db_name.tbl_name как вариант для tbl_name FROM db_name . Эти две инструкции эквивалентны:
SHOW DATABASES вносит в список базы данных на сервере MySQL. Вы можете также получать этот список, используя команду mysqlshow .
SHOW TABLES вносит в список таблицы в заданной базе данных. Вы можете также получать этот список, используя команду mysqlshow db_name .
ОБРАТИТЕ ВНИМАНИЕ: Если пользователь не имеет привилегий для таблицы, соответствующая таблица не будет обнаруживаться в выводе SHOW TABLES или mysqlshow db_name .
SHOW OPEN TABLES вносит в список таблицы, которые являются в настоящее время открытыми в кэше таблиц. Подробнее см. раздел "5.4.6 Как MySQL открывает и закрывает таблицы". Поле Comment сообщает сколько раз таблица кэшируется ( cached ) и используется ( in_use ).
SHOW COLUMNS вносит в список столбцы в данной таблице. Если Вы определяете опцию FULL , Вы также получите привилегии, которые Вы имеете для каждого столбца. Если типы столбцов отличны от ожидаемых, они будут основаны на инструкции CREATE TABLE , заметьте, что MySQL иногда сам изменяет типы столбца.
Инструкция DESCRIBE обеспечивает информацию, подобную SHOW COLUMNS .
SHOW FIELDS является синонимом для SHOW COLUMNS , а SHOW KEYS синонимом для SHOW INDEX . Вы можете также вносить в список столбцы таблицы или индексы с помощью команд mysqlshow db_name tbl_name или mysqlshow -k db_name tbl_name .
SHOW INDEX возвращает индексную информацию в формате, который очень походит на вызов SQLStatistics в ODBC. Следующие столбцы всегда будут возвращены:
Столбец | Назначение |
Table | Имя таблицы. |
Non_unique | 0, если индекс не может содержать дубликаты. |
Key_name | Имя индекса. |
Seq_in_index | Номер последовательности столбца в индексе, начиная с 1 (не с 0!). |
Column_name | Имя столбца. |
Collation | Как столбец сортируется в индексе. В MySQL это может иметь варианты `A' (по возрастанию) или NULL (не сортируемый). |
Cardinality | Число уникальных значений в индексе. Это модифицируется запуском isamchk -a . |
Sub_part | Число индексированных символов, если столбец только частично индексирован. NULL если весь ключ индексирован в полном объеме. |
Comment | Различные замечания. Пока это сообщает, является ли индекс полнотекстовым (FULLTEXT) или нет. |
Обратите внимание, что, поскольку Cardinality будет рассчитано, основываясь на статистике, сохраненной как целые числа, оно не обязательно точно для маленьких таблиц.
SHOW TABLE STATUS (новинка в Version 3.23) работает подобно SHOW STATUS , но обеспечивает много информации относительно каждой таблицы. Вы можете также получать этот список, используя команду mysqlshow --status db_name . Следующие столбцы возвращены:
Столбец | Зачем он нужен |
Name | Имя таблицы. |
Type | Тип таблицы. Подробности в разделе "7 Типы таблиц MySQL". |
Row_format | Формат хранения строки (фиксированный, динамический или сжатый). |
Rows | Число строк. |
Avg_row_length | Средняя длина строки. |
Data_length | Длина файла данных. |
Max_data_length | Максимальная длина файла данных. |
Index_length | Длина индексного файла. |
Data_free | Число распределенных, но не используемых байт. |
Auto_increment | Следующее значение auto_increment. |
Create_time | Когда таблица была создана. |
Update_time | Когда файл данных был в последний раз модифицирован. |
Check_time | Когда таблица была в последний раз проверена на ошибки. |
Create_options | Дополнительные параметры, используемые с CREATE TABLE . |
Comment | Комментарий, используемый при создании таблицы (или информация о том, почему MySQL не может обращаться к информации по данной таблицы). |
Таблицы InnoDB сообщат свободное пространство в ней через поле комментария таблицы.
SHOW STATUS обеспечивает информацию состояния сервера (подобно mysqladmin extended-status ). Вывод походит на показанное ниже, хотя формат и числа будут другими:
Некоторые комментарии относительно вышеупомянутого:
- Если Opened_tables велико, то переменная table_cache , вероятно, слишком маленькая.
- Если key_reads велико, то переменная key_cache , вероятно, слишком маленькая. Коэффицент кэширования может быть вычислен по формуле: key_reads / key_read_requests .
- Если Handler_read_rnd велико, то Вы, вероятно, имеете много запросов, которые требуют, чтобы MySQL просматривал целые таблицы, или Вы имеете объединения, которые не используют ключи правильно.
- Если Threads_created велико, то следует увеличить переменную thread_cache_size .
SHOW VARIABLES показывает значения некоторых переменных системы MySQL. Вы можете также получить эту информацию, используя команду mysqladmin variables . Если значения по умолчанию неподходящие, Вы можете устанавливать большинство этих переменных, используя параметры командной строки mysqld . Подробности в разделе " 4.1.1 Параметры командной строки mysqld".
Вывод походит на показанное ниже, хотя формат и числа будут иными:
Каждая опция описана ниже. Значения для буферных размеров, длин и размеров стека даны в байтах. Вы можете определять значения с суффиксами `K' или `M' , чтобы указать килобайты или мегабайты. Например, 16M указывает 16 мегабайтов. Регистр символов суффикса не имеет значения: 16M и 16m эквивалентны.
ansi_mode . ON , если mysqld запущен с опцией --ansi . Подробности в разделе "1.2.3 Запуск MySQL в режиме ANSI". back_log Сколько ожидающих обработки подключений может иметь MySQL. Это важно, когда главный процесс MySQL получает ОЧЕНЬ много запросов подключения за очень короткое время. Затем требуется некоторое время (хотя очень немного) для основного процесса, чтобы проверить подключение и запустить новый поток. Значение back_log указывает, сколько запросов могут быть сложены в стек в течение этого короткого времени прежде, чем MySQL на мгновение остановит ответы на новые запросы. Вы должны увеличить это только, если Вы ожидаете большое количество подключений за короткий периоде времени (сервер работает интенсивно).
Другими словами, это значение задает размер слушающей очереди для входящих подключений TCP/IP. Ваша операционная система имеет собственное ограничение размера этой очереди. В Unix man-страница listen(2) должна иметь большее количество деталей. Проверьте документацию на Вашу ОС для выяснения максимального значения для этой переменной. Попытка устанавливать back_log выше, чем это ограничение операционной системы, будет неэффективна, хотя и безопасна. basedir Значение опции --basedir . bdb_cache_size Буфер, который распределен, чтобы кэшировать индекс и строки для BDB -таблиц. Если Вы не используете таблицы BDB , Вы должны запустить mysqld с опцией --skip-bdb , чтобы не тратить впустую память для этого кэша. bdb_log_buffer_size Буфер, который распределен, чтобы кэшировать протоколы для BDB -таблиц. Если Вы не используете таблицы BDB , Вы должны запустить mysqld с опцией --skip-bdb , чтобы не тратить впустую память для этого кэша. bdb_home Значение опции --bdb-home . bdb_max_lock Максимальное число блокировок (по умолчанию 1000), которые Вы можете иметь активным на BDB-таблице. Вы должны увеличить это значение, если Вы получаете ошибки типа bdb: Lock table is out of available locks или Got error 12 from . , когда Вы делаете длинные транзакции, или когда mysqld должен исследовать много строк, чтобы вычислить и обработать запрос. bdb_logdir Значение опции --bdb-logdir . bdb_shared_data ON , если Вы используете --bdb-shared-data . bdb_tmpdir Значение опции --bdb-tmpdir . binlog_cache_size . Размер кэша, чтобы хранить инструкции SQL для двоичного файла регистрации в течение транзакции. Если Вы часто используете большие, многооператорные транзакции, Вы можете увеличить это, чтобы получить большую эффективность. character_set Набор символов по умолчанию. character_sets Поддерживаемые наборы символов. concurrent_inserts Если ON (значение по умолчанию), MySQL позволит Вам использовать INSERT на таблицах системы MyISAM в то же самое время, когда Вы выполняете на них запросы SELECT . Вы можете выключить эту опцию запуском mysqld с параметрами --safe или --skip-new . connect_timeout Число секунд, которое сервер mysqld ждет подключения перед ответом Bad handshake . datadir Значение опции --datadir . delay_key_write Если включено (по умолчанию), MySQL учитывает опцию delay_key_write в CREATE TABLE . Это означает, что буфер ключей для таблиц с этой опцией не будет сбрасываться на каждой индексной модификации, а только когда таблица будет закрыта. Это ускорит работу по записи, но Вы должны добавить автоматическую проверку всех таблиц командой myisamchk --fast --force . Обратите внимание, что, если Вы запускаете mysqld с опцией --delay-key-write-for-all-tables , это означает, что все таблицы будут обрабатываться так, как будто они были созданы с опцией delay_key_write . Вы можете очищать этот флажок, запуская mysqld с параметрами --skip-new или --safe-mode . delayed_insert_limit После вставки delayed_insert_limit строк, драйвер INSERT DELAYED проверит, имеется ли любая задержка инструкций SELECT . Если так, это позволяет им выполниться перед продолжением работ с таблицей. delayed_insert_timeout Сколько времени поток INSERT DELAYED должен ждать инструкции INSERT перед своим завершением. delayed_queue_size Каких размеров (в строках) очередь должна быть распределена для обработки INSERT DELAYED . Если очередь заполняется, любой пользователь, который вызвал INSERT DELAYED , будет ждать до появления свободного места в очереди. flush ON , если MySQL был запущен с опцией --flush . flush_time Если это установлено в значение, отличное от нуля, то каждые flush_time секунд все таблицы будут закрыты (чтобы освободить ресурсы и сбросить данные на диск). Я рекомендую эту опцию только на Win95, Win98 или на системах, где Вы имеете очень небольшое количество ресурсов. have_bdb YES , если mysqld поддерживает таблицы Berkeley DB. DISABLED , если использован параметр --skip-bdb . have_innodb YES , если mysqld поддерживает таблицы InnoDB. DISABLED , если использован параметр --skip-innodb . have_raid YES , если mysqld поддерживает опцию RAID . have_ssl YES , если mysqld поддерживает SSL (шифрование) по протоколу клиент/сервер. init_file Имя файла, определенного в параметре --init-file при запуске сервера. Это файл инструкций SQL, которые Вы хотите всегда выполнять при каждом запуске сервера. interactive_timeout Число секунд, которое сервер ждет действий на активном подключении перед его закрытием. Интерактивный пользователь определен как пользователь, который применяет опцию CLIENT_INTERACTIVE для mysql_real_connect() . См. также wait_timeout . join_buffer_size Размер буфера, который используется для полных объединений (объединения, которые не используют индексы). Буфер будет распределен один раз для каждого полного объединения между двумя таблицами. Увеличьте это значение, чтобы ускорить полное объединение, если добавление индексов невозможно. Обычно самый лучший способ получать быстрые объединения состоит в том, чтобы добавить индексы таблицы. key_buffer_size Индексные блоки буферизированы и разделяются всеми потоками. key_buffer_size как раз и задает размер буфера, используемого для индексных блоков. Увеличьте это значение, чтобы улучшить индексную обработку. Но если Вы сделаете его слишком большим (больше, чем 50% общей памяти?), Ваша система может начать использовать своп и стать ДЕЙСТВИТЕЛЬНО медленной. Не забудьте, что поскольку MySQL не кэширует чтение данных, Вы должны оставить некоторый участок памяти для кэша файловой системы ОС.
Раздел, который описывает настройку MySQL, содержит некоторую информацию относительно того, как настроить вышеупомянутые переменные. Подробности смотрите в разделе "5.5.2 Настройка параметров сервера".
SHOW LOGS показывает Вам информацию относительно состояния существующих журналов. В настоящее время этот вызов отображает только информацию относительно журналов Berkeley DB.
- File показывает полный путь к журналу.
- Type показывает тип журнала ( BDB для журналов типа Berkeley DB).
- Status показывает состояние журнала ( FREE если файл может быть удален, или IN USE если файл необходим подсистеме транзакций).
SHOW PROCESSLIST показывает Вам, которые процессы работают. Вы можете также получать эту информацию, используя команду mysqladmin processlist . Если Вы имеете привилегию process , Вы можете видеть все процессы. Иначе Вы можете видеть только Ваши собственные процессы. Если Вы не используете опцию FULL , то только первые 100 символов каждого запроса будут показаны. Подробности в разделе "4.5.4 Синтаксис KILL ".
Is it possible to clean a mysql innodb storage engine so it is not storing data from deleted tables?
Or do I have to rebuild a fresh database every time?
Проверка состояния таблиц
CHECK TABLE tbl_name [, tbl_name .] [option [option]]
option = QUICK | FAST | EXTEND | CHANGED
ANALYZE TABLE tbl_name [, tbl_name.]
Проверка данных таблиц на наличие ошибок для таблиц MyISAM и BDB выполняется функцией CHECK TABLE. Если найдена ошибка в таблице данных или индексов, таблица помечается как дефектная и не может быть использована до тех пор, пока не будет восстановлена.
Анализ ключей можно провести с помощью утилиты myisamchc -a, проверку данных таблиц - с помощью myisamchc -m.
Функция ANALYZE TABLE проверяет состояние индексов в таблицах для MyISAM и BDB. На время проверки таблица обычно блокируется "на чтение".
Ремонтирование таблиц
REPAIR TABLE tbl_name [, tbl_name.] [QUICK] [EXTENDED]
Производит ремонт и сжатие таблиц.
Оптимизация таблиц
OPTIMIZE TABLE tbl_name [, tbl_name2 .]
Оптимизация таблиц используется после большого количества удалений или изменений информации в таблицах. Оптимизация выполняется за счет удаления неиспользуемого места в таблицах и сортировки индексов.
4 Answers 4
Here is a more complete answer with regard to InnoDB. It is a bit of a lengthy process, but can be worth the effort.
Keep in mind that /var/lib/mysql/ibdata1 is the busiest file in the InnoDB infrastructure. It normally houses six types of information:
- Table Data
- Table Indexes Data
- Rollback Segments
- Undo Space
Many people create multiple ibdata files hoping for better disk-space management and performance, however that belief is mistaken.
Unfortunately, running OPTIMIZE TABLE against an InnoDB table stored in the shared table-space file ibdata1 does two things:
- Makes the table’s data and indexes contiguous inside ibdata1
- Makes ibdata1 grow because the contiguous data and index pages are appended to ibdata1
You can however, segregate Table Data and Table Indexes from ibdata1 and manage them independently.
Suppose you were to add innodb_file_per_table to /etc/my.cnf (my.ini) . Can you then just run OPTIMIZE TABLE on all the InnoDB Tables?
Good News : When you run OPTIMIZE TABLE with innodb_file_per_table enabled, this will produce a .ibd file for that table. For example, if you have table mydb.mytable witha datadir of /var/lib/mysql , it will produce the following:
- /var/lib/mysql/mydb/mytable.frm
- /var/lib/mysql/mydb/mytable.ibd
The .ibd will contain the Data Pages and Index Pages for that table. Great.
Bad News : All you have done is extract the Data Pages and Index Pages of mydb.mytable from living in ibdata . The data dictionary entry for every table, including mydb.mytable , still remains in the data dictionary (See the Pictorial Representation of ibdata1). YOU CANNOT JUST SIMPLY DELETE ibdata1 AT THIS POINT . Please note that ibdata1 has not shrunk at all.
To shrink ibdata1 once and for all you must do the following:
Dump (e.g., with mysqldump ) all databases into a .sql text file ( SQLData.sql is used below)
Drop all databases (except for mysql and information_schema ) CAVEAT : As a precaution, please run this script to make absolutely sure you have all user grants in place:
Login to mysql and run SET GLOBAL innodb_fast_shutdown = 0; (This will completely flush all remaining transactional changes from ib_logfile0 and ib_logfile1 )
Add the following lines to /etc/my.cnf (or my.ini on Windows)
(Sidenote: Whatever your set for innodb_buffer_pool_size , make sure innodb_log_file_size is 25% of innodb_buffer_pool_size .
Also: innodb_flush_method=O_DIRECT is not available on Windows)
Delete ibdata* and ib_logfile* , Optionally, you can remove all folders in /var/lib/mysql , except /var/lib/mysql/mysql .
Start MySQL (This will recreate ibdata1 [10MB by default] and ib_logfile0 and ib_logfile1 at 1G each).
Now, ibdata1 will still grow but only contain table metadata because each InnoDB table will exist outside of ibdata1 . ibdata1 will no longer contain InnoDB data and indexes for other tables.
For example, suppose you have an InnoDB table named mydb.mytable . If you look in /var/lib/mysql/mydb , you will see two files representing the table:
- mytable.frm (Storage Engine Header)
- mytable.ibd (Table Data and Indexes)
With the innodb_file_per_table option in /etc/my.cnf , you can run OPTIMIZE TABLE mydb.mytable and the file /var/lib/mysql/mydb/mytable.ibd will actually shrink.
I have done this many times in my career as a MySQL DBA. In fact, the first time I did this, I shrank a 50GB ibdata1 file down to only 500MB!
Give it a try. If you have further questions on this, just ask. Trust me; this will work in the short term as well as over the long haul.
At Step 6, if mysql cannot restart because of the mysql schema begin dropped, look back at Step 2. You made the physical copy of the mysql schema. You can restore it as follows:
Go back to Step 6 and continue
With regard to setting innodb_log_file_size to 25% of innodb_buffer_pool_size in Step 5, that's blanket rule is rather old school.
Back on July 03, 2006 , Percona had a nice article why to choose a proper innodb_log_file_size. Later, on Nov 21, 2008 , Percona followed up with another article on how to calculate the proper size based on peak workload keeping one hour's worth of changes.
I have since written posts in the DBA StackExchange about calculating the log size and where I referenced those two Percona articles.
Personally, I would still go with the 25% rule for an initial setup. Then, as the workload can more accurate be determined over time in production, you could resize the logs during a maintenance cycle in just minutes.
Очистка КЭШа MySQL
FLUSH [HOSTS]
[.LOGS]
[.PRIVILEGES]
[.[TABLE | TABLES] table_name [, table_name.]]
[. TABLES WITH READ LOCK]
[.STATUS]
Очистка КЭШа MySQL сбрасывает всю информацию, находящуюся в КЭШе данных MySQL, на диск. Для выполнения этой операции необходимы привилегии Reload_priv.Ключевое слово HOST указывает MySQL очистить информацию о клиентских площадках. Применяется при смене клиентского IP-адреса или появлении ошибок связи с сервером.
LOGS закрывает и повторно открывает все журналы. Если определен журнал изменений или binary-журнал без расширения, то номер в расширении имени журнала будет увеличен на 1 относительно предыдущего файла.
PRIVILEGES записывает и заново открывает информацию о привилегиях пользователей. Это делается для вступления в силу изменений, сделанных в политике привилегий.
Использование TABLES без перечисления имен таблиц закрывает и открывает все открытые таблицы. При этом записываются все изменения, внесенные в таблицы. При перечислении имен таблиц будет перезагружена информация только из указанных таблиц.
FLUSH TABLES WITH READ LOCK закрывает все открытые таблицы и блокирует их чтение до тех пор, пока не будет выполнена команда UNLOCK TABLES. БЛОКИРОВАНИЕ базы данных подобным образом позволяет выполнять резервное копирование базы данных.
STATUS обнуляет runtime-переменные сервера.
Просмотр информации о базе данных, таблицах, полях и т.д.
SHOW DATABASES [LIKE wild]
or SHOW [OPEN] TABLES [FROM db_name] [LIKE wild]
or SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE wild]
or SHOW INDEX FROM tbl_name [FROM db_name]
or SHOW TABLE STATUS [FROM db_name] [LIKE wild]
or SHOW STATUS [LIKE wild]
or SHOW VARIABLES [LIKE wild]
or SHOW LOGS
or SHOW [FULL]
or SHOW GRANTS FOR user
or SHOW CREATE TABLE table_name
or SHOW MASTER STATUS
or SHOW MASTER LOGS
or SHOW SLAVE STATUS
Команда SHOW позволяет получать информацию о базе данных, таблицах, полях и индексах таблиц, а также информацию о состоянии сервера MySQL.При использовании уточнений LIKE wild, wild является регулярным выражением, в котором могут использоваться символы "%" и "_".
Информация выводится только при наличии у пользователя соответствующих привилегий и прав доступа.
SHOW DATABASES выводит список существующих баз данных на сервере MySQL.
Вывод информации о таблицах и столбцах может происходить с использованием ключевого слова FROM или без него с указанием пути к исследуемому объекту.
mysql> SHOW FIELDS FROM table FROM database;
mysql> SHOW FIELDS FROM database.table;
SHOW TABLES Выводит список существующих таблиц. Ключевое слово OPEN Указывает MySQL выводить только открытые таблицы, данные которых находятся в КЭШе MySQL.SHOW COLUMNS и его синоним SHOW FIELDS выводят список полей таблиц с описанием типов. Если используется ключевое слово FULL, дополнительно выводится информация о привилегиях текущего пользователя.
SHOW INDEX и его синоним SHOW KEYS возвращают данные о первичных ключах и индексах таблицы. Столбцы результата команды SHOW INDEX Имеют значения, перечисленные в табл.
Информация о таблице выводится с помощью команды SHOW TABLE STATUS, Список возвращаемых значений которой приведен в следующей табл.
Команда SHOW STATUS выводит список runtime-переменных, по которым можно судить о состоянии сервера MySQL.
SHOW VARIABLES выводит значения некоторых системных переменных MySQL. Эту же информацию можно получить, используя утилиту WinMySQLadmin (вкладка variables)
SHOW LOGS выводит информацию о существующих журналах.
SHOW PROCESSLIST выводит информацию о выполняющихся потоках. Для того, чтобы видеть все потоки, пользователю нужно иметь привилегии processlist, иначе он сможет увидеть только свои собственные потоки. Без указания опции FULL Выводятся только первые 100 или меньше символов запроса потока. Прервать выполнение потока можно с помощью функции KILL.
SHOW CREATE TABLE выводит SQL-код, с которым создана таблица.
Отключение потока
KILL thread_id
Каждое подключение к MySQL выполняется в отдельном потоке. При необходимости можно определить поток командой SHOW PROCESSLIST и отключить соединение с ним.
Для того, чтобы видеть все потоки, необходимо иметь привилегии Process_priv, иначе видны только потоки текущего пользователя.
Резервное копирование и восстановление таблиц.
BACKUP TABLE tbl_name [, tbl_name.] TO '/path/to/backup/directory'
RESTORE TABLE tbl_name [, tbl_name.] FROM '/path/to/backup/directory'
Функция BACKUP копирует минимально необходимые для восстановления файлы таблиц в указанную директорию.
Функция RESTORE восстанавливает таблицы из файлов, предварительно подготовленных функцией BUCKUP.
Перед восстановлением таблиц необходимо удалить старые таблицы, иначе восстановление не будет произведено. Кроме того, восстановление занимает достаточно много времени по сравнениию с резервированием, так как при этом для таблиц формируются индексы.
Читайте также: