NixOS配置MariaDB时SQL初始化脚本未生效问题排查
NixOS中MariaDB初始化脚本未执行的问题解决
问题概述
在NixOS配置MariaDB时,执行sudo nixos-rebuild switch后,指定的数据库test1和用户stats已成功创建,但main.sql中的表结构和数据并未写入数据库。
现有配置文件
configuration.nix
let statsConfig = { db = "test1"; user = "stats"; password = "1"; }; in { services.mysql = { package = pkgs.mariadb; enable = true; ensureDatabases = [ statsConfig.db ]; replication.role = "master"; replication.slaveHost = "127.0.0.1"; replication.masterUser = "${statsConfig.user}"; replication.masterPassword = "${statsConfig.password}"; initialDatabases = [{ name = "${statsConfig.db}"; schema = ./main.sql; }]; initialScript = ./main.sql; ensureUsers = [ { name = "${statsConfig.user}"; ensurePermissions = { "${statsConfig.db}.*" = "ALL PRIVILEGES"; }; } ]; }; systemd.services.setdbpass = { description = "MySQL database password setup"; wants = [ "mariadb.service" ]; wantedBy = [ "multi-user.target" ]; serviceConfig = { ExecStart = '' ${pkgs.mariadb}/bin/mysql -e "grant all privileges on ${statsConfig.db}.* to ${statsConfig.user}@localhost identified by '${statsConfig.password}'" ${statsConfig.db} ''; User = "root"; PermissionsStartOnly = true; RemainAfterExit = true; }; }; }
main.sql
create table tests ( Id INTEGER NOT NULL, Name VARCHAR(255) NOT NULL, primary key(Id) ); insert into tests values (1, 'a');
问题原因与修复方案
核心原因
NixOS的services.mysql.initialScript和initialDatabases仅在**数据库首次初始化(数据目录为空)**时执行。若之前已执行过nixos-rebuild switch并创建了数据库,后续脚本不会自动重新执行。同时配置initialScript和initialDatabases也可能引发逻辑冲突,导致脚本未正常运行。
修复步骤
清理现有数据库数据(注意:此操作会删除所有现有数据,请谨慎执行):
sudo systemctl stop mariadb sudo rm -rf /var/lib/mysql简化configuration.nix配置:
- 移除多余的
systemd.services.setdbpass,ensureUsers已可完成权限配置,无需额外服务。 - 保留
initialDatabases指定数据库与对应初始化脚本,避免重复配置。
- 移除多余的
修改后的configuration.nix:
let statsConfig = { db = "test1"; user = "stats"; password = "1"; }; in { services.mysql = { package = pkgs.mariadb; enable = true; ensureDatabases = [ statsConfig.db ]; replication.role = "master"; replication.slaveHost = "127.0.0.1"; replication.masterUser = statsConfig.user; replication.masterPassword = statsConfig.password; # 通过initialDatabases绑定数据库与初始化脚本 initialDatabases = [ { name = statsConfig.db; schema = ./main.sql; } ]; ensureUsers = [ { name = statsConfig.user; ensurePermissions = { "${statsConfig.db}.*" = "ALL PRIVILEGES"; }; } ]; }; }
- 重新构建系统配置:
sudo nixos-rebuild switch
验证结果
执行以下命令检查数据库初始化状态:
sudo mysql -u root test1 -e "select * from tests;"
若返回包含1和a的结果,说明初始化成功。
内容的提问来源于stack exchange,提问作者Sqler
相关产品推荐
相关产品推荐

