Mysql FAQ手册
中文乱码
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
mysql的配置文件权限
mysql的配置文件my.cnf权限不能为777,会导致启动mysql失败
mysql的配置文件名字
如果自定义的配置项单独创建文件,不要命名为my.cnf,会导致自定义的配置项的文件不生效
查看mysql的字符集
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
查看mysql使用的cnf文件路径
# mysqld --verbose --help |grep -A 1 'Default options'
设置密码策略
查看密码策略相关配置项
show variables like 'validate_password%'
设置如下两项
set global validate_password_policy='LOW'
set global validate_password_length=4
如果出现is marked as crashed and should be repaired 错误,怎么办?
备份数据库
mysqldump -u root -p xxx> xxx.sql
修复数据库
mysqlcheck -h10.0.132.132 -uroot -p123456 --tables sendmail --auto-repair
备注:
sendmail其实是数据库的名称,也可以用-B 代替tables
启动mysql,报:Can't find messagefile '/usr/share/mysql/errmsg.sys错误怎么办?
在mysqld段增加如下配置:
languate={路径}/errmsg.sys
备注:此处的路径为errmsg.sys的实际路径,可通过find 查找
如何查看当前mysql服务加载哪个路径下的配置文件(my.cnf等)?
mysqld --verbose --help |grep -A 1 'Default options'
备注:从结果可以看到会按照顺序加载如下文件:
/etc/my.cnf
/etc/mysql/my.cnf
/usr/etc/my.cnf
/mysql/my.cnf
~/.my.cnf
Specified key was too long; max key length is 767 bytes
系统变量innodb_large_prefix开启了,则对于使用DYNAMIC或COMPRESSED行格式的InnoDB表,索引键前缀限制为3072字节。如果禁用innodb_large_prefix,不管是什么表,索引键前缀限制为767字节。
上述的bug很明显是索引超出了限制的长度767(我司生产上innodb_large_prefix禁用了):
我发现报错的那张表建立了一个varchar类型的索引,varchar(255),觉得没什么问题,其实不然,上述的767是字节,而varchar类型是字符,同时我发现我使用的字符集为(utf8mb4),这个指每个字符最大的字节数为4,所以很 明显 4*255 > 767
所以就报上述错了(Specified key was too long; max key length is 767 bytes)
解决方法:
改变varchar的字符数,我改成了64就可以了。varchar(64)
或者启用innodb_large_prefix,那么限制值会增加到3072
utf8与utf8bmp4的区别?
在配置文件中设置: innodb_force_recovery=1
启动一次后,再修改为:0
此方法可以在测试环境使用,不建议生产
连接mysql报错:Authentication plugin 'caching_sha2_password' cannot be loaded
由于目前已有的客户端连接软件还不支持Mysql8新增加的加密方式caching_sha2_password,所以我们需要修改用户的加密方式,将其改为老的加密验证方式
use mysql;
select user,plugin from user where user='root';
alter user 'root'@'%' identified with mysql_native_password by 'Root@123';
flush privileges
mysql 1153 got a packet bigger than max_allowed_packet?
# show VARIABLES like '%max_allowed_packet%’;
# set global max_allowed_packet=524288000; #修改 512M
ERROR 1030 (HY000): Got error 28 from storage engine
出现此问题的原因:临时空间不够,无法执行此SQL语句
将tmpdir指向一个硬盘空间很大的目录即可
如何分析慢查询日志?
mysqldumpslow
pt-query-digest
如何恢复数据?
1. 设置普通用户数据库只读
set global read_only=1;
2. 查询binlog的最新pos(标记为A)(DROP DATABASE 是最后执行的语句的关键字)
mysql -uroot -p123456 -e "show binlog events in 'mysql-bin.000001'"|grep -i 'DROP DATABASE'
3. 查询备份数据的最新pos(标记为B)
cat all_database.sql |grep -i 'CHANGE MASTER TO MASTER_LOG_FILE'|head -n1
4. 用备份数据恢复
mysql -uroot -p123456 < all_database.sql
5. 用binlog恢复从B到A的数据;
mysqlbinlog --start-position=13871 --stop-position=15035 -d dbname mysql-bin.000001|mysql -uroot -p123456 dbname
6. 把数据库锁解开
set global read_only=0
如何设置mysql的binlog保留时长?
修改配置文件
例如:保留7天,每个文件大小500M
expire_logs_days=7
max_binlog_size=500M
表示所有binlog日志永久都不会失效,不会自动删除
expire_logs_days=0
修改配置文件,执行如下命令,立即生效。
mysql>flush logs;
备注:如果binlog很多,建议用purge,因为此操作会导致大量的io
也可以通过命令行删除binlog日志
将bin.000055之前的binlog清掉:
mysql>purge binary logs to 'bin.000055';
将指定时间之前的binlog清掉:
mysql>purge binary logs before '2019-09-13 23:59:59';
查看binlog日志模式
mysql> show variables like "%binlog_format%";
修改立即生效
mysql> set global binlog_format='MIXED';