9.2.4 配置持久化与数据库初始化

配置持久化与数据库初始化#

Nacos 默认使用内嵌 Derby 存储,仅适用于开发测试;生产环境应切换为 MySQL 实现配置与元数据持久化。以下包含原理草图、数据库初始化、配置示例、验证、排错与练习。

0. 原理草图(持久化与访问路径)#

文章图片

1. 数据库准备与权限#

要求:MySQL 5.7+/8.0+,字符集 utf8mb4,排序规则 utf8mb4_general_ci。

创建数据库与用户

-- 登录 MySQL(示例)
mysql -uroot -p

-- 创建数据库与用户
CREATE DATABASE nacos_config
  DEFAULT CHARACTER SET utf8mb4
  COLLATE utf8mb4_general_ci;

CREATE USER 'nacos'@'%' IDENTIFIED BY 'Nacos@123';
GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'%';
FLUSH PRIVILEGES;

命令说明
- CREATE DATABASE:创建 Nacos 持久化数据库。
- CREATE USER:创建专用账号,避免使用 root。
- GRANT ALL PRIVILEGES:授权 Nacos 读写与管理表权限。

2. 初始化表结构#

脚本位置$NACOS_HOME/conf/nacos-mysql.sql

执行脚本

# 进入 Nacos 安装目录
cd /opt/nacos

# 初始化表结构
mysql -u nacos -p -h 127.0.0.1 nacos_config < conf/nacos-mysql.sql

关键表说明(示例)
- config_info:配置主表
- his_config_info:配置历史
- tenant_info:命名空间
- users/roles/permissions:鉴权与权限

3. 连接配置(application.properties)#

路径$NACOS_HOME/conf/application.properties

spring.datasource.platform=mysql

# 数据库实例数量
db.num=1

# 连接地址(注意时区与编码)
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai

# 账号与密码
db.user.0=nacos
db.password.0=Nacos@123

说明
- db.num 必须与 db.url.N 数量一致,否则启动失败。
- serverTimezone 避免 MySQL 8.0 时区报错。

4. 启动与验证(含预期效果)#

# 启动 Nacos(单机)
cd /opt/nacos
bin/startup.sh -m standalone

# 查看日志关键字
tail -f logs/start.out | egrep "Datasource|started successfully"

预期日志
- Datasource connection pool initialized
- Nacos started successfully

控制台验证
1. 访问 http://<nacos_host>:8848/nacos
2. 新建配置(示例 dataId:app.yaml
3. 确认数据入库:

SELECT data_id, group_id, tenant FROM config_info LIMIT 5;

5. 常见问题与排错#

1)字符集不一致

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

解决:统一为 utf8mb4。

2)时区报错

The server time zone value 'CST' is unrecognized...

解决:JDBC 增加 serverTimezone=Asia/Shanghai

3)权限不足

SHOW GRANTS FOR 'nacos'@'%';

解决:补充授权并 FLUSH PRIVILEGES

4)连接数不足

SHOW VARIABLES LIKE 'max_connections';

解决:提高连接数并重启 MySQL

6. 练习与实操#

  1. 练习1: 将 Nacos 默认 Derby 切换为 MySQL 并完成持久化验证(提交 SELECT 结果截图)。
  2. 练习2: 修改 db.num=2 并故意只配置 db.url.0,观察启动报错并定位原因。
  3. 练习3: 配置 serverTimezone 后消除时区错误,写出错误日志与修复步骤。