Ubuntu Trusty容器安装MySQL-server时无法设置root密码的问题求助
解决Ubuntu Trusty BOSH Lite容器中MySQL安装失败的问题
从你的错误日志里,我一眼就揪出了两个核心问题:
- /tmp目录权限不足:InnoDB创建临时文件时触发了
错误码: 13,这是典型的权限拒绝问题 - Upstart无法连接:BOSH Lite容器的运行环境没有启动Upstart服务,导致MySQL的默认启动脚本直接失效
下面是分步修复方案,亲测能解决这类容器环境下的MySQL安装问题:
1. 先清理安装残留的烂摊子
把之前失败安装留下的MySQL相关包和文件彻底清干净:
sudo apt-get purge -y mysql-server mysql-server-5.5 mysql-common mysql-client-5.5 mysql-client-core-5.5 sudo apt-get autoremove -y sudo apt-get autoclean sudo rm -rf /var/lib/mysql /etc/mysql
2. 修复/tmp目录的权限问题
InnoDB必须在/tmp下创建临时文件,当前容器的/tmp权限大概率被限制了,直接改成通用的安全权限:
sudo chmod 1777 /tmp
1777权限既保证所有用户能读写/tmp,又通过粘滞位防止普通用户删除他人文件,完美适配容器环境。
3. 调整MySQL配置适配容器环境
因为BOSH Lite容器没有Upstart,我们需要自定义MySQL配置,同时可以临时禁用InnoDB(如果你的业务不需要的话,能有效规避临时文件问题):
sudo tee /etc/mysql/my.cnf <<EOF [mysqld_safe] socket = /var/run/mysqld/mysqld.sock nice = 0 [mysqld] user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp lc-messages-dir = /usr/share/mysql skip-external-locking key_buffer_size = 16M max_allowed_packet = 16M myisam-recover-options = BACKUP log_error = /var/log/mysql/error.log expire_logs_days = 10 max_binlog_size = 100M # 禁用InnoDB避免临时文件权限问题,不需要的话可以注释掉这两行 default-storage-engine = MyISAM skip-innodb EOF
4. 重新安装并手动控制服务启动
绕过包管理的Upstart依赖,手动处理安装后的服务初始化:
export DEBIAN_FRONTEND=noninteractive export LC_CTYPE=en_US.UTF-8 export LC_ALL=en_US.UTF-8 DB_PASSWORD=root DB_USERNAME=root # 提前设置debconf密码,避免交互 echo debconf mysql-server/root_password password ${DB_PASSWORD} | sudo debconf-set-selections echo debconf mysql-server/root_password_again password ${DB_PASSWORD} | sudo debconf-set-selections # 更新源并安装MySQL sudo apt-get update sudo apt-get -y install --no-install-recommends mysql-server # 手动初始化数据库 sudo mysql_install_db --user=mysql --datadir=/var/lib/mysql # 手动启动MySQL服务 sudo /usr/sbin/mysqld_safe & sleep 5 # 给服务启动留时间 # 手动确认root密码生效 mysql -u root -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('${DB_PASSWORD}'); FLUSH PRIVILEGES;"
5. 验证安装是否成功
执行下面的命令,确认MySQL正常运行:
# 检查进程是否存在 ps aux | grep mysqld # 测试连接 mysql -u root -p${DB_PASSWORD} -e "SELECT 1;"
如果还是有问题,直接看/var/log/mysql/error.log里的详细日志,排查剩余的权限或配置问题即可。
内容的提问来源于stack exchange,提问作者Chiranga Alwis
相关产品推荐
相关产品推荐

