这篇文章是原来的《记一次mysql故障处理》,但是随着mysql问题越来越多,我感觉还是集合到一篇里面比较好,也方便之后问题复现的查找
一、记一次mysql故障处理
最近遇到的问题还是有点多的,所以遇到问题就记录一下以免以后忘记了怎么解决
mysql版本5.7,centos环境,无法正常启动服务,提示
2021-06-10T08:18:06.378567Z 0 [ERROR] InnoDB: Trying to access page number 4294967295 in space 0, space name innodb_system, which is outside the tablespace bounds. Byte offset 0, len 16384, i/o type read. I
f you get this error at mysqld startup, please check that your my.cnf matches the ibdata files that you have in the MySQL server.
找了一圈不清楚哪出的问题,因为数据库只是开发环境所以直接重置数据文件
rm -rf /var/lib/mysql/*
如果是生产环境则不能这么简单粗暴,先配置
/etc/my.cnf加入innodb_force_recovery=X行
X为0-6数字
0正常运行mysql
1(SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。
2(SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。
3(SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。
4(SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。
5(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。
6(SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。
数字越大跳过的mysql项就越多,跳过内容向下兼容,本次的mysql直到5才可以正常启动,启动后就可以正常运行服务
当设置innodb_force_recovery参数值大于0后,可以对表进行select,create,drop操作,但insert,update或者delete这类操作
然后进行备份
mysqldump -uroot -p --all-databases> back.sql
再执行上面的重置数据文件
rm -rf /var/lib/mysql/*
之后进入my.cnf取消删除innodb_force_recovery行,重启mysql服务
以下操作么有经过检验:
重新执行MySQL的安全脚本mysql_secure_installation,设置root登录密码,然后登录MySQL进行数据库的恢复。
source back.sql(备份文件的绝对路径);
mysql忘记密码(version 5.7)
在 /etc/my.cnf 【mysql】模块下最后加入skip-grant-tables=1就可以直接使用mysql -uroot 登录,之后进行密码修改操作
GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION;
FLUSH PRIVILEGES;
mysql创建用户、密码
set global validate_password_policy=0;
set global validate_password_length=1;
ALTER USER 'root'@'%' IDENTIFIED BY 'comleader@123';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'comleader@123' WITH GRANT OPTION;
FLUSH PRIVILEGES;
use mysql
CREATE USER 'cmpadmin'@'%' IDENTIFIED BY 'comleader@123';
GRANT ALL PRIVILEGES ON *.* TO 'cmpadmin'@'%' IDENTIFIED BY 'comleader@123' WITH GRANT OPTION;
FLUSH PRIVILEGES;
二、mysql更改默认字符集
https://www.cnblogs.com/xingyunblog/p/3836299.html
三、Mysq加固
1、删除匿名用户
查看
select distinct user from mysql.user;
是否有user为空,没有则没问题
2、配置日志
- 错误日志
- 查询日志
- 慢查询日志
- 二进制日志
- 更新日志
以上所有配置
在/etc/my.cnf中加入以下几行(已经有的行替换掉)
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
general-log
slow-query-log
log-bin
server-id=1
其中‘更新日志’没有查到此项配置
3、禁止管理员账号权限运行mysql
use mysql
select host,user from user;
查看用户root 是否有host为%的,如果有:
Delete FROM user Where User='root' and Host='%';
flush privileges;
四、mysql 重新初始化
这里的命令是已经过期的不过还能用,新的命令还不知道格式
问题:经过一阵断电后,虚拟机mysql出现问题,无法正常打开,按照一种的步骤也无法恢复,此时采用重新手动初始化数据库方法~
/usr/bin/mysql_install_db --user=mysql --basedir=/var/lib/mysql --datadir=/var/lib/mysql/data
msyql无密码登录
my.cnf中加入
skip-grant-tables
mysql启动异常 ERROR! MySQL manager or server PID file could not be found!
创建/usr/local/var/mysql/mysql.pid
chmod -R 777 /usr/local/var/mysql
my.cnf中加入pid-file = /usr/local/var/mysql/mysql.pid
转自
mysql问题记录 - seas - 博客园
https://www.cnblogs.com/seasen/p/14893419.html