如何详细追踪并查询test数据库创建的完整过程记录?
- 内容介绍
- 文章标签
- 相关推荐
在实际项目中,往往会遇到以下痛点:
- 不清楚数据库到底是何时、用什么字符集、校对规则创建的。
- 因为权限不足,执行查看DDL的语句总是报错。
- 已经有了大量业务表。却找不到最初的CREATE DATABASE完整语句,导致迁移或恢复时手足无措。
一、快速获取 test 数据库的创建信息
1. 使用 SHOW CREATE DATABASE
这是 MySQL 提供的最直接方式,一条命令即可返回完整的 DDL。
SHOW CREATE DATABASE test;
执行后会得到类似如下结果:
+----------+--------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------+
| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
2. 通过 INFORMATION_SCHEMA.SCHEMATA 查询元数据
如果想一次性获取多个属性,可以查询程序库 INFORMATION_SCHEMA 的 SCHEMATA 表。
SELECT
SCHEMA_NAME AS database_name,DEFAULT_CHARACTER_SET_NAME AS charset。DEFAULT_COLLATION_NAME AS collation,CREATE_TIME AS create_time
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'test';
3. 用 mysqldump 导出结构而不导出数据
当需要把整个数据库结构保存为文件。便于离线审查或迁移时可使用如下命令:
mysqldump -d -u your_user -p test> test_structure.sql
-d 参数表示只导出 DDL,不包括数据。导出的文件里会包含 CREATE DATABASE所有表的 CREATE TABLE 还有索引、约束等信息。怎么说呢,
二、常见误区与方法
1. “权限不足。无法执行 SHOW CREATE DATABASE”
SHOW CREATE DATABASE 需要至少拥有 SYSTEM_VARIABLES_ADMIN 或者对目标库的 SOME PRIVILEGE 。按理说,说到如果报错,
ERROR 1227 : Access denied;you need SUPER privilege for this operation
至于解决办法,
-
联系 DBA 为当前使用者授予
SHOW VIEW/SYSTEM_VARIABLES_ADMIN权限;或者直接授予对 mysql 数据库的 SELECT 权限。 - 使用具有足够权限的账号登录后再执行上述查询。
2. “不知道数据库创建时用了哪个字符集”
Schemata 表中的 DEFAULT_CHARACTER_SET_NAME 字段即为答案。
3. “需要追踪完整的创建过程而不仅仅是一次性输出”
If you want a step‑by‑step audit log of every DDL operation,enable MySQL 的通用日志或审计插件:
-
audit_log 插件:
INSTALL PLUGIN audit_log SONAME 'audit_log.so';SET GLOBAL audit_log_policy = 'ALL';SET GLOBAL audit_log_format = 'JSON'; -
b. 开启通用查询日志:
在 my.cnf 中加入:
general_log = ON general_log_file = /var/log/mysql/general.log
三、实战案例:从“创建”到“全程追踪”一步到位
步骤 1:创建数据库并记录时间戳
CREATE DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 同时把信息写进自建审计表
INSERT INTO db_audit (
db_name,operation,executed_by,exec_time,sql_statement
) VALUES (
'test'。'CREATE',CURRENT_USER,NOW,'CREATE DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'
),
步骤 2:后续所有 DDL 操作统一走存储过程包装,以便自动写审计日志
// 示例存储过程 DELIMITER $$ CREATE PROCEDURE exec_ddl BEGIN SET @stmt = p_sql;按理说,PREPARE stmt FROM @stmt;EXECUTE stmt; DEALLOCATE PREPARE stmt;INSERT INTO db_audit( db_name,operation,executed_by,exec_time,sql_statement) VALUES( SUBSTRING_INDEX。-- 粗略提取对象名 UPPER),-- 操作类型,如 CREATE/ALTER/DROP CURRENT_USER,-- 执行者 NOW,-- 时间戳 p_sql);-- 完整语句 END$$ DELIMITER;
以后每次要改库结构,只需要调用:
CALL exec_ddl;'),话说回来,
步骤 3:通过审计表回溯完整过程
SELECT *
FROM db_audit
WHERE db_name = 'test'
ORDER BY exec_time;
This query will list every DDL statement that has ever been run against **test** database—creation time,who did it。and exact SQL.
四、常用快捷命令汇总
| # | Description | Main Command |
|---|---|---|
| 1️⃣ | 查看所有数据库 |
|
| 🔹随后定位目标库并获取DDL🔹 |
| |
| 2️⃣ | SchematA 元数据查询: | |
| ||
| #️⃣ | Mysqldump 导出结构:
| |
| #️⃣ | DML/AUDIT 自定义存储过程示例:
| |
| #️⃣ | CUSTOM 审计表回溯:
| |
| #️⃣ | 查看 MySQL 程序表 mysql.db 中记录的数据库信息:
| |
| #️⃣ | 若使用 Oracle,可借助 DBMSMETADATA.GETDDL 获取一样效果:
| #️⃣ | #️⃣ | 在 SQL Server 中。同理使用 sys.databases 与 OBJECTDEFINITION 实现:
date,collation_name FROM sys.databases WHERE name='test';GO |
#✅ &nb sp;& nbsp,& nbsp;& nbsp,& nbsp;& nbsp,& nbsp;& nbsp,& nbsp; |
在实际项目中,往往会遇到以下痛点:
- 不清楚数据库到底是何时、用什么字符集、校对规则创建的。
- 因为权限不足,执行查看DDL的语句总是报错。
- 已经有了大量业务表。却找不到最初的CREATE DATABASE完整语句,导致迁移或恢复时手足无措。
一、快速获取 test 数据库的创建信息
1. 使用 SHOW CREATE DATABASE
这是 MySQL 提供的最直接方式,一条命令即可返回完整的 DDL。
SHOW CREATE DATABASE test;
执行后会得到类似如下结果:
+----------+--------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------+
| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
2. 通过 INFORMATION_SCHEMA.SCHEMATA 查询元数据
如果想一次性获取多个属性,可以查询程序库 INFORMATION_SCHEMA 的 SCHEMATA 表。
SELECT
SCHEMA_NAME AS database_name,DEFAULT_CHARACTER_SET_NAME AS charset。DEFAULT_COLLATION_NAME AS collation,CREATE_TIME AS create_time
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'test';
3. 用 mysqldump 导出结构而不导出数据
当需要把整个数据库结构保存为文件。便于离线审查或迁移时可使用如下命令:
mysqldump -d -u your_user -p test> test_structure.sql
-d 参数表示只导出 DDL,不包括数据。导出的文件里会包含 CREATE DATABASE所有表的 CREATE TABLE 还有索引、约束等信息。怎么说呢,
二、常见误区与方法
1. “权限不足。无法执行 SHOW CREATE DATABASE”
SHOW CREATE DATABASE 需要至少拥有 SYSTEM_VARIABLES_ADMIN 或者对目标库的 SOME PRIVILEGE 。按理说,说到如果报错,
ERROR 1227 : Access denied;you need SUPER privilege for this operation
至于解决办法,
-
联系 DBA 为当前使用者授予
SHOW VIEW/SYSTEM_VARIABLES_ADMIN权限;或者直接授予对 mysql 数据库的 SELECT 权限。 - 使用具有足够权限的账号登录后再执行上述查询。
2. “不知道数据库创建时用了哪个字符集”
Schemata 表中的 DEFAULT_CHARACTER_SET_NAME 字段即为答案。
3. “需要追踪完整的创建过程而不仅仅是一次性输出”
If you want a step‑by‑step audit log of every DDL operation,enable MySQL 的通用日志或审计插件:
-
audit_log 插件:
INSTALL PLUGIN audit_log SONAME 'audit_log.so';SET GLOBAL audit_log_policy = 'ALL';SET GLOBAL audit_log_format = 'JSON'; -
b. 开启通用查询日志:
在 my.cnf 中加入:
general_log = ON general_log_file = /var/log/mysql/general.log
三、实战案例:从“创建”到“全程追踪”一步到位
步骤 1:创建数据库并记录时间戳
CREATE DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 同时把信息写进自建审计表
INSERT INTO db_audit (
db_name,operation,executed_by,exec_time,sql_statement
) VALUES (
'test'。'CREATE',CURRENT_USER,NOW,'CREATE DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'
),
步骤 2:后续所有 DDL 操作统一走存储过程包装,以便自动写审计日志
// 示例存储过程 DELIMITER $$ CREATE PROCEDURE exec_ddl BEGIN SET @stmt = p_sql;按理说,PREPARE stmt FROM @stmt;EXECUTE stmt; DEALLOCATE PREPARE stmt;INSERT INTO db_audit( db_name,operation,executed_by,exec_time,sql_statement) VALUES( SUBSTRING_INDEX。-- 粗略提取对象名 UPPER),-- 操作类型,如 CREATE/ALTER/DROP CURRENT_USER,-- 执行者 NOW,-- 时间戳 p_sql);-- 完整语句 END$$ DELIMITER;
以后每次要改库结构,只需要调用:
CALL exec_ddl;'),话说回来,
步骤 3:通过审计表回溯完整过程
SELECT *
FROM db_audit
WHERE db_name = 'test'
ORDER BY exec_time;
This query will list every DDL statement that has ever been run against **test** database—creation time,who did it。and exact SQL.
四、常用快捷命令汇总
| # | Description | Main Command |
|---|---|---|
| 1️⃣ | 查看所有数据库 |
|
| 🔹随后定位目标库并获取DDL🔹 |
| |
| 2️⃣ | SchematA 元数据查询: | |
| ||
| #️⃣ | Mysqldump 导出结构:
| |
| #️⃣ | DML/AUDIT 自定义存储过程示例:
| |
| #️⃣ | CUSTOM 审计表回溯:
| |
| #️⃣ | 查看 MySQL 程序表 mysql.db 中记录的数据库信息:
| |
| #️⃣ | 若使用 Oracle,可借助 DBMSMETADATA.GETDDL 获取一样效果:
| #️⃣ | #️⃣ | 在 SQL Server 中。同理使用 sys.databases 与 OBJECTDEFINITION 实现:
date,collation_name FROM sys.databases WHERE name='test';GO |
#✅ &nb sp;& nbsp,& nbsp;& nbsp,& nbsp;& nbsp,& nbsp;& nbsp,& nbsp; |

