MySQL常见问题
1、从MySQL8导出sql后导入到MySQL5.7版本中需要解决的问题:
- 替换字符集:utf8mb4_0900_ai_ci -> utf8_general_ci
- 编码转换: utf8mb4 -> utf8
2、mysql从库同步过程中报错如下:

查看错误日志内容如下:
Error 'Lock wait timeout exceeded; try restarting transaction' on query. Default database: 'spt'. Query: 'delete from sync_change where create_time < DATE_SUB(NOW(),INTERVAL 90 DAY)', Error_code: 1205

从错误可以看出,是表sync_change产生了锁,阻塞了delete语句的执行,重试了10次后还是不行,因此导致复制中断,默认情况下,参数innodb_lock_wait_time的时间为50s,因此,解决锁等待超时的办法就可以增加这个参数的值,并增加重试的次数,在my.cnf中,添加参数如下:
innodb_lock_wait_time 300 #可根据自己需要增加
slave_transaction_retries 100 #重试100次
innodb_thread_concurrency = 10 #高并发线程数,一般为cpu×2
3、mysql从库报错
Last_SQL_Errno: 1062
Last_SQL_Error: Error 'Duplicate entry '3116971' for key 'PRIMARY'' on query. Default database: 'xxl_job'. Query: 'INSERT INTO XXL_JOB_QRTZ_TRIGGER_LOG (
错误表明从库在尝试插入一条主键冲突的数据。这是因为从库已经存在主键为 3116971 的记录,而主库又尝试插入相同主键的数据,导致复制中断
解决办法,删除从库中冲突的记录(多条记录就都删除),执行命令如下:
DELETE FROM erp_xxl_job.XXL_JOB_QRTZ_TRIGGER_LOG WHERE id = 3116971;
stop slave;
start slave;
4、mysql主从状态正常,但是在主执行了命令后,从库没有同步更新,查看错误内容如下:
[ERROR] InnoDB: innodb_force_recovery is on. We do not allow database modifications by the user. Shut down mysqld and edit my.cnf to set innodb_force_recovery=0
这个错误表明 MySQL 的 innodb_force_recovery 参数被设置为非零值(通常用于修复 InnoDB 表损坏问题),导致 MySQL 处于只读模式,禁止用户修改数据
innodb_force_recovery 是一个 InnoDB 引擎的故障恢复参数,用于在数据库崩溃或表损坏时尝试恢复数据。它的取值范围是 0 到 6:
- 0:正常模式(默认值)
- 1-6:强制恢复模式,级别越高,恢复操作越激进,但数据库会变为只读模式
解决办法:修改/etc/my.cnf,将innodb_force_recovery修改为0后重启即可
5、mysql通过root用户执行grant命令的时候报错如下:
Access denied for user 'root'@'%' to database 'dbname'"
执行命令查看mysql的权限情况,如图:
select * from mysql.user where user = "root";

从上图卡看出,Grant_priv为N,也就说是没有grant权限的,此时需要修改为Y就可以啦,如下:
update mysql.user set Grant_priv = "Y" where user = "root";
6、MySQL启动或者连接报错,如下:
mysql: [Warning] World-writable config file '/etc/mysql/mysql.conf.d/mysqld.cnf' is ignored
此错误说明MySQL的配置文件权限给的过于宽松(可能是给了777),导致mysql拒绝连接,修改为644即可


