报错信息
类似下面这种情况:
/mysql/bin/mysqld: File './mysql-bin.index' not found (Errcode: 13 - Permission denied)
[ERROR] Aborting
[Note] Binlog end
[Note] /mysql/bin/mysqld: Shutdown complete
触发条件
出现问题的情况:启用mysql的binlog导致的
我这边docker-compose内容如下:
version: '3'
services:
mysql:
container_name: mysql
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=mysql的root密码
volumes:
- ./conf:/etc/mysql
- ./logs:/var/log/mysql
- ./data:/var/lib/mysql
ports:
- 30030:3306
restart: always
为了启用binlog,我的操作是修改配置文件my.cnf,在[mysqld]追加下面文件的最后三行,重启后就报了这个问题
[mysqld]
lower_case_table_names=1
log-bin=/var/lib/mysql/mysql-bin
binlog-format=ROW
server_id=123456
问题分析
看到报错第一行File ‘./mysql-bin.index’ not found (Errcode: 13 - Permission denied),知道是mysql用户对数据库目录内的所有文件不具有写的权限,按照常规的解决办法是chown mysql:mysql -R /var/lib/mysql
但是现在我是通过docker启动的MySQL,就无法控制这个问题了
解决办法
知道了原因,我想到的办法是在第一次启动时my.cnf不加入那三行,只保留下面的内容
[mysqld]
lower_case_table_names=1
然后docker-compose start mysql
启动后执行下面的三步操作
docker exec mysql bash -c "echo 'log-bin=/var/lib/mysql/mysql-bin' >> /etc/mysql/my.cnf"
docker exec mysql bash -c "echo 'binlog-format=ROW' >> /etc/mysql/my.cnf"
docker exec mysql bash -c "echo 'server_id=123456' >> /etc/mysql/my.cnf"
通过这种办法写入后,在执行docker-compose restart mysql
就不会再报错,这时候查询show variables like 'log_bin%'
,binlog已经正常启用