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