O SQL detail audita operações de DDL e bloqueio em bancos de dados e tabelas do PolarDB for MySQL. Ele captura o contexto de execução de cada instrução e remove automaticamente registros anteriores ao período de retenção configurado. Diferentemente do recurso de log de auditoria completo — que audita todas as instruções SQL com uma sobrecarga significativa — o SQL detail foca exclusivamente em eventos de alteração de esquema e bloqueio. Isso o torna ideal para equipes de O&M (operações e manutenção) que precisam de trilhas de auditoria leves e direcionadas.
Como funciona
Quando uma instrução de DDL ou bloqueio inicia a execução, o SQL detail grava um registro na tabela de sistema sys.hist_sqldetail. Após a conclusão da instrução, o PolarDB atualiza o registro com o estado final e as métricas de desempenho. Registros mais antigos que o período de retenção configurado são removidos automaticamente.
O que o SQL detail captura:
Operações de DDL: alterações de esquema, como criação de tabelas, adição de colunas e modificação de índices
Operações de bloqueio: instruções
LOCK TABLEeLOCK DB
O que o SQL detail não captura:
Instruções DML (INSERT, UPDATE, DELETE, SELECT) são intencionalmente excluídas. O SQL detail foi projetado para auditoria de alterações de esquema com baixa sobrecarga, não para registro geral de consultas. Para auditar instruções DML, ative o recurso de log de auditoria completo.
Armazenamento
Cada registro de auditoria consome 1 KB de armazenamento. Por exemplo, 1.024 operações de DDL ou bloqueio por dia, com um período de retenção de 30 dias, consomem aproximadamente 30 MB.
Pré-requisitos
Antes de começar, confirme se seu cluster atende a um dos seguintes requisitos de versão:
PolarDB for MySQL 8.0.1, versão de revisão 8.0.1.1.31 ou posterior
PolarDB for MySQL 8.0.2, versão de revisão 8.0.2.2.12 ou posterior
Para verificar a versão de revisão do seu cluster, consulte Consultar a versão do mecanismo.
Ativar o SQL detail
Configure os seguintes parâmetros no console. Para obter instruções, consulte Especificar parâmetros de cluster e nó.
|
Parâmetro |
Nível |
Padrão |
Valores válidos |
Descrição |
|
|
Global |
OFF |
ON, OFF |
Ativa ou desativa o SQL detail |
|
|
Global |
|
|
Controla quais tipos de operação são auditados. |
|
|
Global |
2592000 |
0–18446744073709551615 |
Período de retenção para registros de auditoria, em segundos. Registros mais antigos que esse valor são removidos automaticamente |
Tabela sys.hist_sqldetail
O PolarDB for MySQL cria automaticamente a tabela de sistema sys.hist_sqldetail durante a inicialização. Não é necessária criação manual.
CREATE TABLE `hist_sqldetail` (
`Id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`State` varchar(16) COLLATE utf8mb4_bin DEFAULT NULL,
`Thread_id` bigint(20) unsigned DEFAULT NULL,
`Host` varchar(60) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
`User` varchar(32) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
`Client_ip` varchar(60) COLLATE utf8mb4_bin DEFAULT NULL,
`Db` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL,
`Sql_text` mediumtext COLLATE utf8mb4_bin NOT NULL,
`Server_command` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL,
`Sql_command` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL,
`Start_time` timestamp(6) NULL DEFAULT NULL,
`Exec_time` bigint(20) DEFAULT NULL,
`Wait_time` bigint(20) DEFAULT NULL,
`Error_code` int(11) DEFAULT NULL,
`Rows_sent` bigint(20) DEFAULT NULL,
`Rows_examined` bigint(20) DEFAULT NULL,
`Rows_affected` bigint(20) DEFAULT NULL,
`Logical_read` bigint(20) DEFAULT NULL,
`Phy_sync_read` bigint(20) DEFAULT NULL,
`Phy_async_read` bigint(20) DEFAULT NULL,
`Process_info` text COLLATE utf8mb4_bin,
`Extra` text COLLATE utf8mb4_bin,
`Create_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`Update_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (`Id`),
KEY `i_start_time` (`Start_time`),
KEY `i_update_time` (`Update_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
Referência de colunas
|
Coluna |
Descrição |
|
|
ID de registro com incremento automático |
|
|
Estado da operação no momento da gravação do registro |
|
|
ID da thread que executou a instrução |
|
|
Host associado ao usuário em execução |
|
|
Nome de usuário usado para executar a instrução |
|
|
Endereço IP do cliente |
|
|
Banco de dados onde a instrução foi executada |
|
|
Texto completo da instrução SQL |
|
|
Tipo de comando do servidor (por exemplo, |
|
|
Tipo de instrução (por exemplo, |
|
|
Timestamp de início da execução (precisão de microssegundos) |
|
|
Duração da execução, em microssegundos. Use este valor para identificar operações de DDL excepcionalmente lentas |
|
|
Tempo de espera da instrução antes do início da execução, em microssegundos. Valores altos podem indicar contenção de bloqueio |
|
|
Código de erro. Um valor diferente de zero indica falha na instrução; use este campo para rastrear alterações de esquema malsucedidas |
|
|
Número de linhas retornadas |
|
|
Número de linhas verificadas |
|
|
Número de linhas afetadas |
|
|
Número de leituras lógicas |
|
|
Número de leituras físicas síncronas |
|
|
Número de leituras físicas assíncronas |
|
|
Informações estendidas de processamento |
|
|
Informações estendidas adicionais |
|
|
Timestamp de criação do registro |
|
|
Timestamp da última atualização do registro |
Exemplo
Este exemplo demonstra como o SQL detail captura operações de DDL e bloqueio, ignorando instruções DML.
Etapa 1: Defina loose_awr_sqldetail_enabled como ON no console e execute as seguintes instruções:
create table t(c1 int);
-- Query OK, 0 rows affected (0.02 sec)
create table t(c1 int);
-- ERROR 1050 (42S01): Table 't' already exists
alter table t add column c2 int;
-- Query OK, 0 rows affected (0.02 sec)
-- Records: 0 Duplicates: 0 Warnings: 0
lock tables t read;
-- Query OK, 0 rows affected (0.00 sec)
unlock tables;
-- Query OK, 0 rows affected (0.00 sec)
insert into t values(1, 2);
-- Query OK, 1 row affected (0.00 sec)
Etapa 2: Consulte os registros de auditoria:
select * from sys.hist_sqldetail\G
Saída esperada:
*************************** 1. row ***************************
Id: 1
State: FINISH
Thread_id: 18
Host: localhost
User: root
Client_ip: 127.0.0.1
Db: test
Sql_text: create table t(c1 int)
Server_command: Query
Sql_command: create_table
Start_time: 2023-01-13 16:18:21.840435
Exec_time: 17390
Wait_time: 318
Error_code: 0
Rows_sent: 0
Rows_examined: 0
Rows_affected: 0
Logical_read: 420
Phy_sync_read: 0
Phy_async_read: 0
Process_info: NULL
Extra: NULL
Create_time: 2023-01-13 16:18:22.391407
Update_time: 2023-01-13 16:18:22.391407
*************************** 2. row ***************************
Id: 2
State: FINISH
Thread_id: 18
Host: localhost
User: root
Client_ip: 127.0.0.1
Db: test
Sql_text: create table t(c1 int)
Server_command: Query
Sql_command: create_table
Start_time: 2023-01-13 16:18:22.416321
Exec_time: 822
Wait_time: 229
Error_code: 1050
Rows_sent: 0
Rows_examined: 0
Rows_affected: 0
Logical_read: 55
Phy_sync_read: 0
Phy_async_read: 0
Process_info: NULL
Extra: NULL
Create_time: 2023-01-13 16:18:23.393071
Update_time: 2023-01-13 16:18:23.393071
*************************** 3. row ***************************
Id: 3
State: FINISH
Thread_id: 18
Host: localhost
User: root
Client_ip: 127.0.0.1
Db: test
Sql_text: alter table t add column c2 int
Server_command: Query
Sql_command: alter_table
Start_time: 2023-01-13 16:18:34.123947
Exec_time: 16420
Wait_time: 245
Error_code: 0
Rows_sent: 0
Rows_examined: 0
Rows_affected: 0
Logical_read: 778
Phy_sync_read: 0
Phy_async_read: 0
Process_info: NULL
Extra: NULL
Create_time: 2023-01-13 16:18:34.394067
Update_time: 2023-01-13 16:18:34.394067
*************************** 4. row ***************************
Id: 4
State: FINISH
Thread_id: 18
Host: localhost
User: root
Client_ip: 127.0.0.1
Db: test
Sql_text: lock tables t read
Server_command: Query
Sql_command: lock_tables
Start_time: 2023-01-13 16:19:49.891559
Exec_time: 145
Wait_time: 129
Error_code: 0
Rows_sent: 0
Rows_examined: 0
Rows_affected: 0
Logical_read: 0
Phy_sync_read: 0
Phy_async_read: 0
Process_info: NULL
Extra: NULL
Create_time: 2023-01-13 16:19:50.399585
Update_time: 2023-01-13 16:19:50.399585
*************************** 5. row ***************************
Id: 5
State: FINISH
Thread_id: 18
Host: localhost
User: root
Client_ip: 127.0.0.1
Db: test
Sql_text: unlock tables
Server_command: Query
Sql_command: unlock_tables
Start_time: 2023-01-13 16:19:56.924648
Exec_time: 98
Wait_time: 0
Error_code: 0
Rows_sent: 0
Rows_examined: 0
Rows_affected: 0
Logical_read: 0
Phy_sync_read: 0
Phy_async_read: 0
Process_info: NULL
Extra: NULL
Create_time: 2023-01-13 16:19:57.400294
Update_time: 2023-01-13 16:19:57.400294
A saída contém cinco registros — um para cada instrução de DDL e bloqueio. A instrução insert into t values(1, 2) não foi registrada porque o SQL detail não captura operações DML.
A linha 2 exibe Error_code: 1050 referente à tentativa duplicada de CREATE TABLE. O SQL detail registra tanto instruções bem-sucedidas quanto malsucedidas, fornecendo à equipe de O&M um histórico completo das tentativas de alteração de esquema, incluindo aquelas que falharam.