MySQL常见问题汇总
MySQL 启动关闭方法
service方式启动关闭
正常安装的MySQL实例会将安装的mysql.service复制至/etc/init.d/目录下,并配置chkconfig,该方式安装的MySQL可以使用service管理工具进行启动和关闭MySQL即可
1 | # 查看是否有注册service服务 |
未注册MySQL服务
未注册MySQL服务,需要对MySQL的目录结构有一定了解,通过mysqld_safe去开启MySQL服务,通过mysqladmin去关闭该服务
注:首次拿到MySQL服务器,对MySQL的目录结构不了解的情况下,建议使用ps -ef | grep mysql
命令查看已有的MySQL进程信息,将该信息保留下来方便后续对该服务进行操作
1 | [root@mysql2 opt]# ps -ef | grep mysql |
从上面的例子可以看出,该MySQL的软件所在目录/usr/local/mysql/bin
,mysql的配置文件使用的是默认的/etc/my.cnf
,socket文件路径在/var/lib/mysql/mysql.sock
等
通过上面的进程信息,编写如下命令就可以关闭mysql服务,非紧急状况下不建议直接kill MySQL的进程。关闭该MySQL实例的方法:
1 | /usr/local/mysql/bin/mysqladmin -uroot -p --socket=/var/lib/mysql/mysql.sock shutdown |
启动上面关闭掉的MySQL实例
1 | /usr/local/mysql/bin/mysqld_safe --default-file=/etc/my.cnf --user=mysql & |
MySQL 主从启动关闭顺序
启动MySQL主从
1
2
3
4
5
6
7
8
9
10
111.启动主库实例
service mysqld start
2.启动从库实例
service mysqld start
3.启动从库日志应用
SQL > start slave;
4.查看从库应用状态
SQL > show slave status \G关闭MySQL主从环境
1
2
3
4
5
6
7
81.关闭从库日志应用
SQL > stop slave;
2.关闭从库实例
service mysqld stop
3.关闭主库实例
service mysqld start注意:MySQL默认启动是不会执行start slave操作,所以每次启动关闭主备环境的实例时要在从库上执行start slave命令去手工启动日志应用服务
MySQL配置必要参数说明
初始化前参数检测:
1 | SHOW VARIABLES WHERE variable_name in ( |
说明:
lower_case_table_names = 1 | 忽略表明大小写 |
log_bin_trust_function_creators=1 | MySQL带有函数的SQL操作模式 |
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES | MySQL的严格模式 |
transaction_isolation = READ-COMMITTED | 使用RC隔离级别 |
innodb_large_prefix=ON | 允许innodb使用长索引类型,单列索引长度上限扩展到3072个字节,不开启将导致varchar较长的字段类型索引创建失败 |
SYS库下面的常用性能视图说明
1 | x$innodb_lock_waits 查看当前innodb的锁状态信息 |
举例:
产看写入操作较多的表的信息
1 | select `file`,`count_read`,`total_read`,`avg_read`,`count_write`,`total_written`,`avg_write`,`total`,`write_pct` from sys.io_global_by_file_by_bytes where file like '%ibd' order by count_write desc limit 10; |
MySQL估算数据库大小
1 | SELECT CONCAT(ROUND(SUM(data_length/1024/1024),2),'MB') AS data_length_MB,CONCAT(ROUND(SUM(index_length/1024/1024),2),'MB') AS index_length_MB FROM information_schema.TABLES WHERE table_schema='sys' |
命令端估算只统计了表和索引文件大小,完整 MySQL占用空间需datadir目录下的所有文件
MySQL 解锁用户
当用户短时间内在同一个IP持续有中断到到MySQL请求,超过max_connect_errors的限制时,再进行连接是MySQL会抛出ERROR 1129 (00000)的异常信息
1 | # 此时需执行FLUSH HOSTS命令进行解锁。 |
MySQL 死锁处理
1 | # 查询是否锁表 |
MySQL 用户管理
创建用户ecology
1
CREATE USER 'dev'@'192.168.1.%' IDENTIFIED BY "dev123";
赋予dev用户允许190.168.1.0/24网段登入权限,允许该用户增删改查dev数据库下面的对象
1
grant select,update,delete,insert on dev.* to dev@'192.168.1.%';
MySQL 5.7版本可以使用一条命令实现上面的用户创建
1
GRANT select,update,delete,insert ON dev.* TO dev@'192.168.1.%' IDENTIFIED BY "dev123";
赋予all privileges权限,下面给出创建用户模板
1
GRANT ALL PRIVILEGES ON *.* TO 'dev'@'192.168.1.%' IDENTIFIED BY "dev123";
查看用户赋权信息:
1
2show grants for 'dev'@'192.168.1.%';
select * from mysql.user;删除用户
1
drop user 'dev'@'192.168.1.%';
刷新权限:每次权限有新更改或者创建删除用户后记得刷新权限,使的新的权限生效
1
FLUSH PRIVILEGES;
MySQL 重要参数优化
max_connections = 3000
- 运行MySQL的最大连接数,根据客户需求进行配置
innodb_buffer_pool_size = 8G
- InnoDB的缓冲池大小,使用缓存池取数据,可以降低数据库I/O次数,设置过大会导致数据库的换页操作频繁甚至达到瓶颈,实例crash等,推荐使用内存的50%-80%即可
max_allowed_packet = 32M
- 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小,长SQL相对设置的可以较大,一般设置32M足够使用
innodb_file_io_threads = 8
- innodb用来同步IO操作的IO线程的数量,Linux下推荐设置为8
innodb_thread_concurrency = 16
- InnoDb 核心内的允许线程数量,推荐设置为CPU的个数或者CPU个数的倍数
innodb_flush_log_at_trx_commit = 0
- 控制MySQL刷新事务日志到磁盘的方式,从0-2,对数据的保护等级越来越高,对数据库的性能影响也越来越大,建议使用0
innodb_log_buffer_size = 16M
- 用来缓冲日志数据的缓冲区的大小,一般16M或者32M即可
MySQL root密码丢失处理
没有记住MySQL数据库root用户默认密码(为初始化安装mysql时默认生成)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 修改/etc/my.cnf文件,在[mysqld]的段中加上一句:skip-grant-tables
# 重启mysql服务
[root@localhost ~]# service mysqld restart
# 以无密码方式进入mysql:
[root@localhost ~]# /usr/local/mysql/bin/mysql -uroot -p
Enter password: 直接回车
mysql>use mysql
输出:Database changed
mysql> update user set authentication_string='' where user='root';
# 重置密码后再将/etc/my.cnf文件中添加的“skip-grant-tables”注释掉
# 重启mysql服务
[root@localhost ~]# service mysqld restart
[root@localhost ~]# /usr/local/mysql/bin/mysql -uroot -p
Enter password:直接回车
mysql> set password = '123.com';
输出:Query OK, 0 rows affected (0.02 sec)
mysql> flush privileges;
输出:Query OK, 0 rows affected (0.00 sec)重新进入mysql,验证root密码是否修改成功
MySQL 重新初始化实例
关闭mysql服务
1
service mysqld stop
清理datadir(本例中指定的是/var/lib/mysql)指定的目录下的文件,将该目录下的所有文件删除或移动至其他位置
1
2cd /var/lib/mysql
mv * /opt/mysql_back/初始化实例
1
/usr/local/mysql/bin/mysqld --initialize --user=mysql
重复安装过程中创建用户的步骤,修改默认密码,重新创建数据库和用户即可
1
2
3
4
5
6/usr/local/mysql/bin/mysql -uroot -p
mysql> set password = 'mysqltest123';
mysql>create database test;
mysql> create user dev identified with mysql_native_password by 'dev123';
mysql> grant all privileges on *.* to 'dev'@'%';
mysql> flush privileges;
连接数据库报错
问题描述:日志报错Public Key Retrieval is not allowed的解决方法
解决方法:
1
2
3# 1.在jdbc url上添加&allowPublicKeyRetrieval=true
# 2.修改数据库的密码加密方式:
alter user xxx@'%' identified with mysql_native_password by "xxx";