4. 数据库准备:MySQL/PostgreSQL 安装与配置、创建基线核验专用数据库与用户、初始化表结构

基线核验环境的核心是持久化存储层。Template 生成引擎在运行过程中需要记录模板版本、校验规则、执行日志以及基线快照。本章将指导你完成数据库选型、安装配置、专用库与用户创建,以及核心表结构的初始化。

4.1 数据库选型对比

平台门户支持两种主流关系型数据库:MySQL 8.0+ 与 PostgreSQL 15+。下表从基线核验场景的关键维度进行对比,帮助你根据现有基础设施做出选择。

对比维度 MySQL 8.0+ PostgreSQL 15+
JSON 支持 原生 JSON 类型,索引支持较弱 原生 JSONB 类型,支持 GIN 索引,查询性能更优
全文检索 内置全文索引,适合简单搜索 tsvector/tsquery,支持中文分词扩展
并发写入 MVCC 实现,默认行级锁 MVCC + 快照隔离,高并发下写入更稳定
扩展性 主从复制、InnoDB Cluster 流复制、逻辑复制、Citus 分布式
运维成熟度 社区广泛,工具链丰富 适合复杂查询与数据完整性要求高的场景
基线核验推荐 标准场景,快速部署 复杂校验逻辑、JSON 模板存储场景
选型建议:如果团队已有 MySQL 运维体系且基线校验逻辑相对简单,优先使用 MySQL。如果模板结构复杂、需要频繁进行 JSON 字段内的条件查询,推荐 PostgreSQL + JSONB 组合。

4.2 数据库安装与基础配置

4.2.1 MySQL 安装与配置

以下步骤基于 CentOS 7/8 环境,使用官方 YUM 仓库安装 MySQL 8.0。

# 1. 安装 MySQL 8.0 仓库
rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

# 2. 安装 MySQL 服务
yum install -y mysql-community-server

# 3. 启动并设置开机自启
systemctl start mysqld
systemctl enable mysqld

# 4. 获取临时 root 密码
grep 'temporary password' /var/log/mysqld.log

# 5. 执行安全配置向导
mysql_secure_installation

基础配置项(/etc/my.cnf 关键参数):

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
max_connections = 500
innodb_buffer_pool_size = 2G
innodb_log_file_size = 512M
sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

4.2.2 PostgreSQL 安装与配置

以下步骤基于 CentOS 7/8 环境,使用官方 YUM 仓库安装 PostgreSQL 15。

# 1. 安装 PostgreSQL 15 仓库
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# 2. 安装 PostgreSQL 15
yum install -y postgresql15-server

# 3. 初始化数据库
/usr/pgsql-15/bin/postgresql-15-setup initdb

# 4. 启动并设置开机自启
systemctl start postgresql-15
systemctl enable postgresql-15

基础配置项(/var/lib/pgsql/15/data/postgresql.conf 关键参数):

listen_addresses = '*'
max_connections = 500
shared_buffers = 2GB
work_mem = 64MB
wal_level = replica
max_wal_size = 4GB
min_wal_size = 1GB
安全注意:生产环境不要直接使用 root 或 postgres 超级用户连接应用。必须创建专用数据库和用户,并遵循最小权限原则。

4.3 创建基线核验专用数据库与用户

无论选择 MySQL 还是 PostgreSQL,都需要创建独立的数据库和用户。以下分别给出两种数据库的 SQL 脚本。

4.3.1 MySQL 创建脚本

-- 创建基线核验专用数据库
CREATE DATABASE baseline_verify
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

-- 创建专用用户,密码请替换为强密码
CREATE USER 'bv_user'@'%' IDENTIFIED BY 'YourStrongPassword!2024';

-- 授予数据库全部权限
GRANT ALL PRIVILEGES ON baseline_verify.* TO 'bv_user'@'%';

-- 刷新权限
FLUSH PRIVILEGES;

-- 验证
SHOW DATABASES LIKE 'baseline_verify';
SELECT user, host FROM mysql.user WHERE user = 'bv_user';

4.3.2 PostgreSQL 创建脚本

-- 切换到 postgres 用户执行
sudo -u postgres psql

-- 创建基线核验专用数据库
CREATE DATABASE baseline_verify
  ENCODING 'UTF8'
  LC_COLLATE = 'en_US.UTF-8'
  LC_CTYPE = 'en_US.UTF-8'
  TEMPLATE template0;

-- 创建专用用户,密码请替换为强密码
CREATE USER bv_user WITH PASSWORD 'YourStrongPassword!2024';

-- 授予数据库连接权限
GRANT CONNECT ON DATABASE baseline_verify TO bv_user;

-- 授予 schema 使用权限
\c baseline_verify
CREATE SCHEMA IF NOT EXISTS baseline;
GRANT USAGE, CREATE ON SCHEMA baseline TO bv_user;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA baseline TO bv_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA baseline GRANT ALL ON TABLES TO bv_user;

-- 验证
\l baseline_verify
\du bv_user
权限说明:PostgreSQL 中 GRANT ALL PRIVILEGES ON DATABASE 并不包含 schema 内部对象的权限,必须额外对 schema 和默认权限进行授权,否则应用无法建表或写入数据。

4.4 初始化表结构

基线核验环境的核心表结构围绕 模板定义、校验规则、执行记录 和 基线快照 四个主题设计。以下给出跨数据库兼容的 DDL 脚本。

4.4.1 模板定义表(template_def)

CREATE TABLE template_def (
    id              BIGSERIAL PRIMARY KEY,
    template_name   VARCHAR(128) NOT NULL,
    template_version VARCHAR(32) NOT NULL,
    template_type   VARCHAR(32) NOT NULL DEFAULT 'standard',
    content_json    JSONB NOT NULL,
    md5_hash        VARCHAR(64) NOT NULL,
    status          VARCHAR(16) NOT NULL DEFAULT 'active',
    created_by      VARCHAR(64) NOT NULL,
    created_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE (template_name, template_version)
);

COMMENT ON TABLE template_def IS '模板定义表,存储引擎使用的模板元数据与内容';
COMMENT ON COLUMN template_def.content_json IS '模板内容,JSONB 格式存储';
COMMENT ON COLUMN template_def.md5_hash IS '模板内容的 MD5 哈希,用于完整性校验';

4.4.2 校验规则表(verify_rule)

CREATE TABLE verify_rule (
    id              BIGSERIAL PRIMARY KEY,
    rule_code       VARCHAR(64) NOT NULL UNIQUE,
    rule_name       VARCHAR(128) NOT NULL,
    rule_type       VARCHAR(32) NOT NULL DEFAULT 'field_check',
    severity        VARCHAR(16) NOT NULL DEFAULT 'error',
    rule_expression JSONB NOT NULL,
    rule_desc       TEXT,
    is_enabled      BOOLEAN NOT NULL DEFAULT TRUE,
    created_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

COMMENT ON TABLE verify_rule IS '校验规则表,定义基线核验的检查项';
COMMENT ON COLUMN verify_rule.rule_expression IS '规则表达式,JSONB 格式,支持嵌套条件';

4.4.3 执行记录表(execution_log)

CREATE TABLE execution_log (
    id              BIGSERIAL PRIMARY KEY,
    template_id     BIGINT NOT NULL REFERENCES template_def(id),
    rule_id         BIGINT NOT NULL REFERENCES verify_rule(id),
    exec_uuid       VARCHAR(64) NOT NULL UNIQUE,
    exec_status     VARCHAR(16) NOT NULL DEFAULT 'pending',
    total_checks    INT NOT NULL DEFAULT 0,
    passed_checks   INT NOT NULL DEFAULT 0,
    failed_checks   INT NOT NULL DEFAULT 0,
    error_message   TEXT,
    started_at      TIMESTAMP,
    finished_at     TIMESTAMP,
    created_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_exec_log_template ON execution_log(template_id);
CREATE INDEX idx_exec_log_status ON execution_log(exec_status);

COMMENT ON TABLE execution_log IS '执行记录表,记录每次基线核验的执行情况';

4.4.4 基线快照表(baseline_snapshot)

CREATE TABLE baseline_snapshot (
    id              BIGSERIAL PRIMARY KEY,
    exec_id         BIGINT NOT NULL REFERENCES execution_log(id),
    snapshot_data   JSONB NOT NULL,
    snapshot_hash   VARCHAR(64) NOT NULL,
    data_version    INT NOT NULL DEFAULT 1,
    created_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_snapshot_exec ON baseline_snapshot(exec_id);

COMMENT ON TABLE baseline_snapshot IS '基线快照表,存储每次核验通过后的完整基线数据';

4.5 数据库初始化流程总览

下图展示了从数据库安装到表结构初始化的完整流程,以及各步骤之间的依赖关系。

数据库初始化流程总览 1. 安装数据库服务 2. 基础参数配置 3. 创建专用数据库 4. 创建专用用户并授权 5. 执行 DDL 初始化表结构 6. 连接验证 前置条件 • 操作系统已就绪 • 网络端口可访问 • 磁盘空间充足 验证清单 • 数据库连接成功 • 用户权限正确 • 表结构完整

4.6 连接验证

表结构初始化完成后,使用以下命令验证数据库是否可正常连接并查询表信息。

4.6.1 MySQL 验证

mysql -h 127.0.0.1 -u bv_user -p baseline_verify -e "SHOW TABLES;"
mysql -h 127.0.0.1 -u bv_user -p baseline_verify -e "DESC template_def;"

4.6.2 PostgreSQL 验证

PGPASSWORD='YourStrongPassword!2024' psql -h 127.0.0.1 -U bv_user -d baseline_verify -c "\dt baseline.*"
PGPASSWORD='YourStrongPassword!2024' psql -h 127.0.0.1 -U bv_user -d baseline_verify -c "\d baseline.template_def"
验证通过标志:成功列出 4 张核心表(template_def、verify_rule、execution_log、baseline_snapshot),且无权限报错,即表示数据库准备阶段完成。