九个MySQL数据库经典错误( 二 )


解决方法:
在主从两台机器上设置不同的 server-id 。
Last_SQL_Errno: 1032(从库少数据 , 主库更新的时候 , 从库报错)
Last_SQL_Error:Could not execute Update_rows event on table test.t; Can't find record in 't', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000014, end_log_pos 1708解决问题的办法:
根据报错信息 , 我们可以获取到报错日志和position号 , 然后就能找到主库执行的哪条sql , 导致的主从报错 。
在主库执行:
/usr/local/mysql/bin/mysqlbinlog --no-defaults -v -v --base64-output=decode-rows /data/mysql/mysql-bin.000014 |grep -A 10 1708 > 1.log
cat 1.log
#170720 14:20:15 server id 3 end_log_pos 1708 CRC32 0x97b6bdec Update_rows: table id 113 flags: STMT_END_F### UPDATE `test`.`t`### WHERE### @1=4 /* INT meta=0 nullable=0 is_null=0 */### @2='dd' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */### SET### @1=4 /* INT meta=0 nullable=0 is_null=0 */### @2='ddd' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */# at 1708#170720 14:20:15 server id 3 end_log_pos 1739 CRC32 0xecaf1922 Xid = 654COMMIT/*!*/;DELIMITER ;# End of log fileROLLBACK /* added by mysqlbinlog */;/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;获取到 sql 语句之后 , 就可以在从库反向执行 sql 语句 。把从库缺少的 sql 语句补全 , 解决报错信息 。
在从库依次执行:
mysql> insert into t (b) values ('ddd');
Query OK, 1 row affected (0.01 sec)
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
[root@node4 bin]# ./pt-slave-restart -uroot -proot123
2017-07-20T14:31:37 p=...,u=root node4-relay-bin.000005 283 1032
Top 3:MySQL安装过程中的报错
[root@zs data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &[1] 3758[root@zs data]# 170720 14:41:24 mysqld_safe Logging to '/data/mysql/error.log'.170720 14:41:24 mysqld_safe Starting mysqld daemon with databases from /data/mysql170720 14:41:25 mysqld_safe mysqld from pid file /data/mysql/node4.pid ended170720 14:41:24 mysqld_safe Starting mysqld daemon with databases from /data/mysql2017-07-20 14:41:25 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details)./usr/local/mysql/bin/mysqld: File '/data/mysql/mysql-bin.index' not found (Errcode: 13 - Permission denied)2017-07-20 14:41:25 4388 [ERROR] Aborting解决思路:
遇到这样的报错信息 , 我们要学会时时去关注错误日志 error log 里面的内容 。看见了关键的报错点 Permission denied 。证明当前 MySQL 数据库的数据目录没有权限 。
解决方法:
[root@zs data]# chown mysql:mysql -R mysql
[root@zs data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
[1] 4402
[root@zs data]# 170720 14:45:56 mysqld_safe Logging to '/data/mysql/error.log'.
170720 14:45:56 mysqld_safe Starting mysqld daemon with databases from /data/mysql
启动成功 。
如何避免这类问题 , 个人建议在安装 MySQL 初始化的时候 , 一定加上--user=mysql , 这样就可以避免权限问题 。
./mysql_install_db --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --defaults-file=/etc/my.cnf --user=mysql
Top 4:数据库密码忘记的问题
[root@zs ~]# mysql -uroot -pEnter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)[root@zs ~]# mysql -uroot -pEnter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)我们有可能刚刚接手别人的 MySQL 数据库 , 而且没有完善的交接文档 。root 密码可以丢失或者忘记了 。
解决思路:
目前是进入不了数据库的情况 , 所以我们要考虑是不是可以跳过权限 。因为在数据库中 , mysql数据库中user表记录着我们用户的信息 。
解决方法:
启动 MySQL 数据库的过程中 , 可以这样执行:
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables &
这样启动 , 就可以不用输入密码 , 直接进入 mysql 数据库了 。然后在修改你自己想要改的root密码即可 。
update mysql.user set password=password('root123') where user='root';
Top 5:truncate 删除数据 , 导致自动清空自增ID , 前端返回报错 not found 。
这个问题的出现 , 就要考虑下 truncate 和 delete 的区别了 。


推荐阅读