MySQL General Log
-
16-10-2019 - |
Вопрос
Есть ли вдали, чтобы MySQL сбрасывал свой журнал на удаленный сервер MySQL?
Я хотел бы проверить подключения MySQL, но я не хочу, чтобы сервер хранил всю информацию локально на своем собственном оборудовании.
Решение
У меня хорошие новости и плохие новости об этом.
ХОРОШИЕ НОВОСТИ
Вы можете использовать общий журнал в качестве таблицы, которую вы можете запросить
Шаг 01) Добавьте это в /etc/my.cnf
[mysqld]
log
log-output=TABLE
Шаг 02) service mysql restart
ОК Mysqld не записывает каждый запрос в таблице mysql.general_log
. Анкет Проблема: посмотрите на начальную планировку mysql.general_log
:
mysql> show create table mysql.general_log\G
*************************** 1. row ***************************
Table: general_log
Create Table: CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
1 row in set (0.09 sec)
Что хорошего в общем журнале как таблица CSV
Шаг 03) сделать mysql.general_log
таблица myisam и указать его
SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
SET GLOBAL general_log = @old_log_state;
Теперь это похоже на это:
mysql> show create table general_log\G
*************************** 1. row ***************************
Table: general_log
Create Table: CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL,
KEY `event_time` (`event_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='General log'
1 row in set (0.00 sec)
mysql>
Значения пользователя и хоста добавляются вместе в полях user_host.
Как вы поверните общий журнал?
Вот пример того, как выпустить mysql.general_log
:
SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
CREATE TABLE mysql.general_log_new LIKE mysql.general_log;
DROP TABLE mysql.general_log;
ALTER TABLE mysql.general_log_new RENAME mysql.general_log;
SET GLOBAL general_log = @old_log_state;
Вот пример того, как сохранить последние 3 дня записей:
SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
CREATE TABLE mysql.general_log_new LIKE mysql.general_log;
INSERT INTO mysql.general_log_new
SELECT * FROM mysql.general_log WHERE event_time > NOW() - INTERVAL 3 DAY;
DROP TABLE mysql.general_log;
ALTER TABLE mysql.general_log_new RENAME mysql.general_log;
SET GLOBAL general_log = @old_log_state;
ПЛОХИЕ НОВОСТИ
Все, что вы собрали в версии Text File The General Log, не придет для поездки. Вы можете собрать новые записи в будущем.
Другие советы
Вы можете настроить монтирование NFS на ваш целевой сервер и просто указать на общий путь журнала на это крепление.
Вместо перезапуска MySQL вы можете сделать это:
SET GLOBAL log_output = 'TABLE';
Сервер немедленно начнет регистрировать `mysql`.`general_log`
.