MySQL常见问题及解决方法有哪些?

摘要:一、连接问题 1、MySQL连接错误 ERROR 1129 (00000): Host ” is blocked because of many connection errors 连接MySQL 报错&a
一、连接问题 1、MySQL连接错误 ERROR 1129 (00000): Host ” is blocked because of many connection errors 连接MySQL报错ERROR 1129 (00000): Host ” is blocked because of many connection errors 同一个IP在短时间内产生太多终端的数据库连接(超过mysql数据库max_connection_errors设置),导致被阻塞。 在系统变量:max_connect_errors设置了允许中断的次数,超过了这个次数(或者超过了默认的次数),mysql就会报如上错误,并拒绝新的连接(相当于拉黑了),直到执行 mysqladmin flush-hosts 命令或者 FLUSH_HOSTS 命令。 方法一:执行mysqladmin flush-hosts命令或者 FLUSH HOSTS 命令 mysqladmin flush-host /* FLUSH HOSTS*/ 方法二:直接重启Mysql服务 方法三:临时解决命令行登录mysql执行set global max_connect_errors = 1000;,并通过 show variables like '%max_connection_errors%' ;命令检查一下是否修改成功。 set global max_connect_errors = 1000; show variables like '%max_connection_errors%' 问题复现方法: #telnet ip port telnet 192.168.1.1 3306 2、Navicat 进入 MySQL 提示错误:Table 'performance_schema.session_variables' doesn't exist 以为是MySQL服务启动有问题,重新启动了下服务,仍然没有解决 找到MySQL安装目录,进入bin文件夹下,在bin文件夹下运行命令行窗口,输入以下命令: mysql_upgrade -u root -p --force 根据提示输入密码: 回车后会出现以下信息: 如果出现的是以下信息,则需要额外多输入一行命令: mysql_upgrade -u root -p --force --skip-version-check 此时在navicat里再次连接,已经可以正常使用了。 3、MySql数据库启动服务提示1067错误启动失败 mysql数据库所在的主机重启了,主机启动后mysql服务并没有自动启动,在服务管理里手动启动mysql服务时报了一个错,提示mysql启动失败错误1067. 然后问了查了度娘好多人的经验分享都是没啥用的,然后自己排查时发现主机本地进程里有mysql残留的进程没有关闭 ,在任务管理器中关闭和mysql相关的进程,然后重启服务即可。 二、主从问题 1、MySQL 从库同步数据报错: Can't find record in '表名', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000111, end_log_pos 26598 由于两边数据不一致,主库host表的某条数据在从库不存在,导致同步时执行update报错。 修复的原理很简单,找到主从不一致的这条数据,在从库补上,让update能执行就好。由于需要从binlog里找数据,需要确保中断之后的binlog没被删除,否则就只能重搭了。 导出日志: mysqlbinlog -v --stop-position=265980893 /binlog_path/mysql-bin.000641 > /tmpbinlog.log 查询记录end_log_pos=537973695所在位置,找到对应update语句; 找到对应的数据再从库中手动添加进去,然后重启slave。 三、其它问题 1、MySQL 5.6.39 修改 root 密码不生效 修改root密码不生效的问题,修改密码后新密码不生效,依旧只能使用旧密码登录 使用update命令修改密码 update user set password=password('新密码') where user='root' and host='%'; 刷新权限: flush privileges; 重启数据库服务,修改后新密码没有生效 需要把不同权限的 root账号的密码全部更改才行,我本来只想把“%”权限的root修改,这样是不行的,需要修改全部。 2、死锁问题:Lock wait timeout exceeded; try restarting transaction 超过锁定等待超时;尝试重新启动事务 流程不严谨问题导致SQL执行操作了全部数据,导致update语句执行时间过长导致死锁。 死锁导致表被锁定,系统其他对这个表的RUD操作会被卡住,导致报错等一系列问题。 使用命令窗口或者Navicat连接数据库后使用以下命令语句进行排查: 1、查看当前数据库所有的执行中的进程。 show processlist; 在结果列表里可以看到数据库下所有的进程,以及相关语句。 id:进程ID,如果需要结束某个进程可以直接kill线程id,例如:kill 1。 user:当前用户,如果不是root,这个命令只会显示你权限范围内的sql语句。 host:显示这个语句是从哪个ip的哪个端口上发出的。可用来追踪出问题语句的用户。 db:显示这个进程目前连接的是哪个数据库。 command:显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。 2、查看数据库中当前运行的所有事务 select * from information_schema.innodb_trx; 在结果列表中可以看到是否有表锁等待或者死锁,如果有死锁发生,可以通过一下命令来杀掉当前运行的事务。 kill581; kill后面的数字是 trx_mysql_thread_id列的值。 自己解决这个问题的时候也是参考的这个结果列表,可以根据对应的SQL语句,以及trx_started:事务开始时间字段,开始时间字段可以看到是否已经开始很长一段时间。 根据对应的SQL语句进行分析优化或者杀掉对应的事务即可。 trx_id:事务ID。 trx_state:事务状态,有以下几种状态:RUNNING、LOCK WAIT、ROLLING BACK 和 COMMITTING。 trx_started:事务开始时间。 trx_requested_lock_id:事务当前正在等待锁的标识,可以和 INNODB_LOCKS 表 JOIN 以得到更多详细信息。 trx_wait_started:事务开始等待的时间。 trx_weight:事务的权重。 trx_mysql_thread_id:事务线程 ID,可以和 PROCESSLIST 表 JOIN。 trx_query:事务正在执行的 SQL 语句。 trx_operation_state:事务当前操作状态。 trx_tables_in_use:当前事务执行的 SQL 中使用的表的个数。 trx_tables_locked:当前执行 SQL 的行锁数量。 trx_lock_structs:事务保留的锁数量。 trx_lock_memory_bytes:事务锁住的内存大小,单位为 BYTES。 trx_rows_locked:事务锁住的记录数。包含标记为 DELETED,并且已经保存到磁盘但对事务不可见的行。 trx_rows_modified:事务更改的行数。 trx_concurrency_tickets:事务并发票数。 trx_isolation_level:当前事务的隔离级别。 trx_unique_checks:是否打开唯一性检查的标识。 trx_foreign_key_checks:是否打开外键检查的标识。 trx_last_foreign_key_error:最后一次的外键错误信息。 trx_adaptive_hash_latched:自适应散列索引是否被当前事务锁住的标识。 trx_adaptive_hash_timeout:是否立刻放弃为自适应散列索引搜索 LATCH 的标识。