MySQL初始化失败error(mysqld --initialize / mysql_install_db) 没有创建系统数据库(prematurely with errno= 32)

在Ubuntu上使用MySQL5.7.10创建数据库实例时,mysqld和mysql_install_db命令因默认安装的MySQL5.6.x影响导致初始化错误32,系统数据库文件未能生成。解决方案是在初始化时添加--no-defaults参数,并确保其位于参数首位,例如:`mysqld --no-defaults --initialize` 或 `mysql_install_db --no-defaults`。参考链接提供了更多详情。

文章目录

问题

在一个备份机上创建多个数据库实例,以此同步部分正式环境的数据库,用于备份等其他用途。
版本:MySQL5.7.10

  • mysql_install_db

命令:

/usr/local/mysql5710/bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql5710 --datadir=/mysqldata/data/

报错:

2016-04-12 06:24:58 [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize 2016-04-12 06:25:03 [ERROR]  Child process: /usr/local/mysql5710/bin/mysqldterminated prematurely with errno= 32 2016-04-12 06:25:03 [ERROR]   Failed to execute /usr/local/mysql5710/bin/mysqld --bootstrap --datadir=/mysqldata/data
--lc-messages-dir=/usr/local/mysql5710/share --lc-messages=en_US --basedir=/usr/local/mysql5710
-- server log begin --

-- server log end --
  • mysqld

命令:

 /usr/local/mysql5710/bin/mysqld --initialize --user=mysql
--basedir=/usr/local/mysql
mkdir -p /data/330{7,8,9}/data 2.5.2 准备配置文件 cat > /data/3307/my.cnf <<EOF[mysqld] basedir=/app/mysql datadir=/data/3307/data socket=/data/3307/mysql.sock log_error=/data/3307/mysql.log port=3307 server_id=7 log_bin=/data/3307/mysql-binEOF cat > /data/3308/my.cnf <<EOF[mysqld] basedir=/app/mysql datadir=/data/3308/data socket=/data/3308/mysql.sock log_error=/data/3308/mysql.log port=3308 server_id=8 log_bin=/data/3308/mysql-binEOF cat > /data/3309/my.cnf <<EOF[mysqld] basedir=/app/mysql datadir=/data/3309/data socket=/data/3309/mysql.sock log_error=/data/3309/mysql.log port=3309 server_id=9 log_bin=/data/3309/mysql-binEOF 2.5.3 初始化三套数据 mv /etc/my.cnf /etc/my.cnf.bak mysqld --initialize-insecure --user=mysql --datadir=/data/3307/data --basedir=/app/mysql mysqld --initialize-insecure --user=mysql --datadir=/data/3308/data --basedir=/app/mysql mysqld --initialize-insecure --user=mysql --datadir=/data/3309/data --basedir=/app/mysql 2.5.4 systemd管理多实例 cd /etc/systemd/system cp mysqld.service mysqld3307.service cp mysqld.service mysqld3308.service cp mysqld.service mysqld3309.service vim mysqld3307.serviceExecStart=/app/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf vim mysqld3308.serviceExecStart=/app/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf vim mysqld3309.serviceExecStart=/app/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf 2.5.5 授权 chown -R mysql.mysql /data/* 2.5.6 启动 systemctl start mysqld3307.service systemctl start mysqld3308.service systemctl start mysqld3309.service 2.5.7 验证多实例 netstat -lnp|grep 330 mysql -S /data/3307/mysql.sock -e "select @@server_id" mysql -S /data/3308/mysql.sock -e "select @@server_id" mysql -S /data/3309/mysql.sock -e "select @@server_id"
最新发布
08-14
<think>我们正在配置MySQL多实例环境,需要创建三个实例(例如3306、3307、3308)。每个实例需要独立的数据目录、配置文件、socket文件、端口和日志文件。 步骤: 1. 规划目录结构 2. 创建每个实例的数据目录、日志目录等 3. 为每个实例编写配置文件 4. 初始化每个实例的数据目录 5. 启动各个实例 6. 设置环境变量和客户端登录(可选) 参考引用[2]中的目录结构,我们可以设计如下: /mysql_multi ├── 3306 │ ├── data # 数据目录 │ ├── my.cnf # 实例配置文件 │ ├── log # 日志目录(可放置error log, slow log等) │ └── tmp # 临时文件目录(可选) ├── 3307 │ ├── data │ ├── my.cnf │ ├── log │ └── tmp └── 3308 ├── data ├── my.cnf ├── log └── tmp 接下来,我们详细说明每个步骤。 步骤1:规划目录结构 假设我们选择根目录为`/mysql_multi`,然后为每个实例创建子目录。 步骤2:创建目录 使用命令创建目录: ```bash sudo mkdir -p /mysql_multi/{3306,3307,3308}/{data,log,tmp} ``` 步骤3:编写配置文件 每个实例的配置文件(如`/mysql_multi/3306/my.cnf`)需要包含以下基本内容(以3306实例为例): ```ini [mysqld] # 实例唯一标识 server-id=1 # 基础目录 basedir=/usr # MySQL安装的基础目录,根据实际情况调整(例如:/usr 或 /usr/local/mysql) datadir=/mysql_multi/3306/data socket=/mysql_multi/3306/mysql.sock # 网络和端口 port=3306 # 日志 log-error=/mysql_multi/3306/log/mysql_error.log pid-file=/mysql_multi/3306/mysql.pid # 其他配置 # 避免多实例冲突的配置 tmpdir=/mysql_multi/3306/tmp ``` 注意:每个实例的`server-id`、`port`、`datadir`、`socket`、`pid-file`、`log-error`必须不同。 步骤4:初始化数据目录 使用`mysqld`命令初始化每个实例的数据目录。注意:MySQL 5.7及以上版本使用`mysqld --initialize`,而之前版本使用`mysql_install_db`。 假设我们使用MySQL 5.7+,初始化命令如下(以3306实例为例): ```bash mysqld --defaults-file=/mysql_multi/3306/my.cnf --initialize --user=mysql ``` 说明: - `--defaults-file`:指定该实例的配置文件,必须作为第一个选项。 - `--initialize`:初始化数据目录,并生成临时密码(在error log中)。 - `--user`:指定运行MySQL的用户,需要确保该用户对数据目录有权限。 初始化后,在error log中会生成临时密码,路径为配置文件中`log-error`指定的路径。 步骤5:启动实例 可以使用`mysqld_safe`启动,也可以使用`systemd`(需要编写service文件)或者`mysqld_multi`。这里使用`mysqld_safe`启动: ```bash mysqld_safe --defaults-file=/mysql_multi/3306/my.cnf & ``` 为了管理方便,可以编写启动脚本。 步骤6:客户端登录 登录指定实例: ```bash mysql -S /mysql_multi/3306/mysql.sock -uroot -p ``` 然后修改root密码: ```sql ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; ``` 重复以上步骤,为3307和3308实例进行配置。 注意事项: 1. 确保每个实例的数据目录、socket文件、pid文件、端口等不冲突。 2. 确保MySQL用户对各个目录有读写权限。 3. 如果使用SELinux,请注意安全上下文。 引用[1]中提到多实例的优缺点: - 优点:充分利用服务器资源,通过不同实例实现资源隔离。 - 缺点:存在资源竞争,需要更多的管理成本。 引用[2]中展示了多实例的目录结构,我们可以参考。 引用[3]中显示了配置文件的读取顺序,但我们在启动时使用`--defaults-file`指定配置文件,因此不会读取默认路径的配置文件。 引用[4]中提到了MySQL Workbench等工具,但多实例配置主要在命令行完成。 下面我们具体写出配置三个实例的完整步骤(以MySQL 5.7为例):</think>### 配置 MySQL 多实例环境(3个实例)完整指南 #### 📁 步骤1:规划目录结构(参考引用[2]) ```bash /mysql_multi ├── 3306 │ ├── data # 数据目录 │ ├── my.cnf # 实例配置文件 │ └── log # 日志目录 ├── 3307 │ ├── data │ ├── my.cnf │ └── log └── 3308 ├── data ├── my.cnf └── log ``` 创建目录结构: ```bash sudo mkdir -p /mysql_multi/{3306,3307,3308}/{data,log} sudo chown -R mysql:mysql /mysql_multi # 授权给MySQL用户 ``` #### ⚙️ 步骤2:配置实例文件(以3306为例) `/mysql_multi/3306/my.cnf` 配置内容: ```ini [mysqld] # 实例唯一标识 server-id=1 # 基础目录 basedir=/usr # MySQL安装目录 datadir=/mysql_multi/3306/data socket=/mysql_multi/3306/mysql.sock # 网络和端口 port=3306 # 日志 log-error=/mysql_multi/3306/log/mysql_error.log pid-file=/mysql_multi/3306/mysql.pid # 避免多实例冲突的配置 tmpdir=/mysql_multi/3306/tmp ``` #### 🔄 其他实例配置差异: | 配置项 | 3306实例 | 3307实例 | 3308实例 | |-------------|---------------|---------------|---------------| | `server-id` | 1 | 2 | 3 | | `port` | 3306 | 3307 | 3308 | | `datadir` | .../3306/data | .../3307/data | .../3308/data | | `socket` | .../3306/sock | .../3307/sock | .../3308/sock | #### 🚀 步骤3:初始化数据目录(参考引用[3]) ```bash # 初始化3306实例 mysqld --defaults-file=/mysql_multi/3306/my.cnf --initialize-insecure --user=mysql # 初始化3307实例 mysqld --defaults-file=/mysql_multi/3307/my.cnf --initialize-insecure --user=mysql # 初始化3308实例 mysqld --defaults-file=/mysql_multi/3308/my.cnf --initialize-insecure --user=mysql ``` > **注意**: > 1. `--initialize-insecure` 生成空密码(生产环境用 `--initialize` 生成随机密码) > 2. 查看初始化日志:`cat /mysql_multi/3306/log/mysql_error.log` #### ⚡ 步骤4:启动多实例服务 ```bash # 启动3306实例 mysqld_safe --defaults-file=/mysql_multi/3306/my.cnf & # 启动3307实例 mysqld_safe --defaults-file=/mysql_multi/3307/my.cnf & # 启动3308实例 mysqld_safe --defaults-file=/mysql_multi/3308/my.cnf & ``` 验证进程: ```bash ps aux | grep mysqld | grep defaults-file ``` #### 🔐 步骤5:连接实例并设置密码(参考引用[4]) ```bash # 连接3306实例 mysql -S /mysql_multi/3306/mysql.sock -u root -p ``` ```sql --MySQL客户端执行 ALTER USER 'root'@'localhost' IDENTIFIED BY 'SecurePass1'; FLUSH PRIVILEGES; ``` > 重复以上步骤修改3307和3308实例的密码 #### 📊 步骤6:验证多实例运行 ```bash # 检查端口监听 netstat -tulnp | grep mysql # 检查实例进程 mysqladmin -S /mysql_multi/3306/mysql.sock -p ping mysqladmin -S /mysql_multi/3307/mysql.sock -p ping mysqladmin -S /mysql_multi/3308/mysql.sock -p ping ``` #### 💡 管理建议 1. **启动脚本**:创建`/etc/init.d/mysql3306`等启动脚本 2. **日志轮转**:配置`logrotate`管理各实例日志 3. **备份策略**:为每个实例设置独立备份计划 4. **资源隔离**:使用cgroups限制每个实例的CPU/内存 > **关键点**:多实例的核心是**独立的配置文件**和**隔离的数据目录**,通过`--defaults-file`参数实现配置隔离[^1][^3]。此方法比容器更轻量,比单实例更高效利用资源[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值