0
点赞
收藏
分享

微信扫一扫

MySQL的优化以及排错

迪莉娅1979 04-02 17:30 阅读 2

目录

一、MySQL的优化

1、调优思路

2、优化的方法

①硬件优化

②数据库设计与规划(基于架构上的优化)

③查询优化

④磁盘IO规划,IO相关的技术

⑥my.cnf内参数的优化

3、对查询进行缓存

4、强制限制mysql资源设置

5、关键字缓冲区

6、数据库性能相关的知识以及命令

5.1查看每个客户端IP过来的连接消耗了多少资源。 

5.2查看某个数据文件上发生了多少IO请求。 

5.3查看每个用户消耗了多少资源。 

5.4查看总共分配了多少内存。 

5.5数据库连接来自哪里,以及这些连接对数据库的请求情况是怎样的? 

5.6查看当前正在执行的SQL和执行show full processlist的效果相当。 

5.7数据库中哪些SQL被频繁执行? 

5.8哪个文件产生了最多的IO,读多,还是写的多? 

5.9哪个表上的IO请求最多? 

5.10哪个表被访问的最多? 

5.11哪些SQL执行了全表扫描,如果没有使用索引,则考虑为大型表添加索引 

5.12列出所有做过排序的规范化语句

5.13哪些SQL语句使用了临时表,又有哪些用到了磁盘临时表? 

5.14列出所有使用临时表的语句——访问最高的磁盘临时表,然后访问内存临时表

5.15 哪个表占用了最多的buffer pool? 

5.16每个库(database)占用多少buffer pool? 

二、mysql的故障有哪些

故障一:错误2002(HY000):无法通过套接字“/data/mysql/mysql.sock”连接到本地MySQL服务器(2)

故障二:错误1045(28000):用户“root”@“localhost”的访问被拒绝(使用密码:否)

故障三:远程连接数据库时候偶尔会发生远程连接数据库很慢的问题

故障四:无法打开文件:"xxx_forums"MY!'

故障五:错误1129(HY000):主机“xxx.xxx.xxx”由于许多连接错误而被阻塞;请使用“mysqladmin flush-hosts”解除阻塞

故障六:连接太多

故障七:警告:世界可写配置文件“/etc/my.cnf”被忽略了错误!MySQL正在运行,但找不到PID文件

故障八:错误:第14178页日志序列号29455369832InnoDB:是在未来!当前系统日志序列号29455369832

故障九:从!/o线程停止,因为主线程和从线程具有相同的MySQL服务器id;这些id必须不同才能进行复制(或者必须在从丝编辑上使用--replicate-same-server-id选项)但这并不总是有意义的;使用前请查看说明书)。

故障十:mysql停止奴隶;编辑设置全局SQL SLAVE_SKIP_COUNTER=1;

故障十一:初始化中继日志位置时出错:I/0从二进制日志读取头时出错


一、MySQL的优化

1、调优思路

①硬件优化

②数据库设计与规划--以后再修改的话会很麻烦,根据数据量来选择使用什么存储引擎

③数据的应用--就是这么读取数据,SQL语句的优化

④磁盘IO优化

⑤操作系统的优化--内核、TCP连接数量

⑥MySQL服务优化--内存的使用,磁盘的使用

⑦my.cnf内参数的优化

⑧分库分表思路和优劣

2、优化的方法

①硬件优化

合理的配置硬件资源,使用高性能的存储设备,增加内存容量等

例:CPU:推荐使用S.M.P.架构的多路对称CPU

内存:4GB以上的物理内存

磁盘:raid1+0磁盘阵列或固态硬盘

②数据库设计与规划(基于架构上的优化)

纵向拆解:专机专用

例:现在公司一台服务器同时负责 web、ftp、数据库等多个角色。 R720 dell 内存 :768G 纵向拆解后就是:数据库服务器专机专用,避免额外的服务可能导致的性能下降和不稳定性。

横向拆解:主从同步,负载均衡,高可用性集群,当单个MySQL数据库无法满足日益增加的需求时,可以考虑在数据库这个逻辑层面增加多台服务器,以达到稳定,高效的效果。

③查询优化
  1. 建表时表结构要合理,每个表不宜过大;在任何情况下均应使用最精确的类型。例如,如果ID列用int是一个好主意,    而用text类型则是个蠢办法;TIME列酌情使用DATE或者DATETIME。
  2. 索引,建立合适的索引。
  3. 查询时尽量减少逻辑运算(与运算、或运算、大于小于某值的运算);
  4. 减少不当的查询语句,不要查询应用中不需要的列,比如说 select * from  等操作。
  5. 减小事务包的大小;
  6. 将多个小的查询适当合并成一个大的查询,减少每次建立/关闭查询时的开销;
  7. 某些过于复杂的查询拆解成多个小查询,和上一条恰好相反
  8. 建立和优化存储过程来代替大量的外部程序交互。
④磁盘IO规划,IO相关的技术

raid技术:raid0或者raid10

SSD

15000转,raid5、raid10、ssd

swap分区:最好使用raid0或者SSD

磁盘分区:将数据库目录放在一个分区或一个磁盘上的物理分区,存储数据的硬盘或分区和系统所在的硬盘分开。

⑤MySQL服务优化(数据库服务的优化)

⑥my.cnf内参数的优化

优化总原则:给MySQL的资源太少,则MySQL施展不开:给MySQL的资源太多,可能会拖累整个os。40%资源给OS,60-70%,给MySQL(内存和CPU)

3、对查询进行缓存

大多数LAMP应用都严重依赖于数据库查询,查询的大致过程如下:

PHP发出查询请求->数据库收到指令对查询语句进行分析->确定如何查询->从磁盘中加载信息->返回结果

如果反复查询,就反复执行这些。MySQL         有一个特性称为查询缓存,他可以将查询的结果保存在内存中,在很多情况下,这会极大地提高性能。不过,问题是查询缓存在默认情况下是禁用的。

4、强制限制mysql资源设置

5、关键字缓冲区

6、数据库性能相关的知识以及命令

数据库性能相关


5.1查看每个客户端IP过来的连接消耗了多少资源。 


mysql> select * from sys.x$host_summary;


5.2查看某个数据文件上发生了多少IO请求。 


mysql> select * from sys.x$io_global_by_file_by_bytes;


5.3查看每个用户消耗了多少资源。 


mysql> select * from sys.x$user_summary;


5.4查看总共分配了多少内存。 


mysql> select * from sys.x$memory_global_total;


5.5数据库连接来自哪里,以及这些连接对数据库的请求情况是怎样的? 


查看当前连接情况。 
mysql> select host, current_connections, statements from sys.x$host_summary;


5.6查看当前正在执行的SQL和执行show full processlist的效果相当。 


mysql> select conn_id, user, current_statement, last_statement from sys.x$session;


5.7数据库中哪些SQL被频繁执行? 


执行下面命令查询TOP10 SQL。 
mysql> select db,exec_count,query from sys.x$statement_analysis order by exec_count desc limit 10;


5.8哪个文件产生了最多的IO,读多,还是写的多? 


mysql> select * from sys.x$io_global_by_file_by_bytes limit 10;


5.9哪个表上的IO请求最多? 


mysql> select * from sys.x$io_global_by_file_by_bytes where file like "%ibd" order by total desc limit 10;


5.10哪个表被访问的最多? 


先访问statement_analysis,根据热门SQL排序找到相应的数据表。 
哪些语句延迟比较严重? 
查看statement_analysis中avg_latency的最高的SQL。 
mysql> select * from sys.x$statement_analysis order by avg_latency desc limit 10;


5.11哪些SQL执行了全表扫描,如果没有使用索引,则考虑为大型表添加索引 


mysql> select * from sys.x$statements_with_full_table_scans;


5.12列出所有做过排序的规范化语句


mysql> select * from sys.x$statements_with_sorting


5.13哪些SQL语句使用了临时表,又有哪些用到了磁盘临时表? 


查看statement_analysis中哪个SQL的tmp_tables 、tmp_disk_tables值大于0即可。 


mysql> select db, query, tmp_tables, tmp_disk_tables from sys.x$statement_analysis where tmp_tables>0 or tmp_disk_tables >0 order by (tmp_tables+tmp_disk_tables) desc limit 20;


5.14列出所有使用临时表的语句——访问最高的磁盘临时表,然后访问内存临时表


mysql>select * from sys.statements_with_temp_tables


5.15 哪个表占用了最多的buffer pool? 


mysql> select * from sys.x$innodb_buffer_stats_by_table order by allocated desc limit 10;


5.16每个库(database)占用多少buffer pool? 


mysql> select * from sys.x$innodb_buffer_stats_by_schema order by allocated desc limit 10;


select table_name,TABLE_COMMENT,CONCAT(TRUNCATE(data_length / 1024 / 1024/1024, 4),\"GB\") AS data_size,table_rows from information_schema.tables where table_schema="dbname"

二、mysql的故障有哪些

故障一:错误2002(HY000):无法通过套接字“/data/mysql/mysql.sock”连接到本地MySQL服务器(2)

①故障现象:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket
'/data/mysql/mysql.sock'(2)

②问题分析:数据库未启动或者数据库端口被防火墙拦截

③解决的方法:

1、检查mysql服务器是否在运行

  • 使用命令 sudo service mysql status(对于 Ubuntu)或者 sudo systemctl status mysql(对于 CentOS)来确认 MySQL 服务器是否正在运行。

2、检查mysql配置文件

  • 确保 MySQL 配置文件中的套接字路径正确。默认情况下,该路径通常是 /var/lib/mysql/mysql.sock
  • 如果你使用了自定义的套接字路径,请确保配置文件中的路径和实际路径一致。

3、重启MySQL服务

  • 如果 MySQL 服务器正在运行,尝试重启它,可以使用 sudo service mysql restart(对于 Ubuntu)或者 sudo systemctl restart mysql(对于 CentOS)。

4、检查MySQL套接字文件的权限

  • 确保 MySQL 套接字文件的权限设置正确,允许 MySQL 进程访问该文件。

5、检查系统日志以获取更多的信息

  • 查看系统日志文件(通常位于 /var/log/mysql/error.log 或 /var/log/mysqld.log)以获取关于连接问题的更多详细信息。

故障二:错误1045(28000):用户“root”@“localhost”的访问被拒绝(使用密码:否)

①故障现象:

ERROR 1045 (28000): Access denied for user 'root'@"ocahost' (using password:
NO)

②问题分析:密码不正确或者没有访问权限

③解决方法:

1、确认用户名和密码

检查是否输入正确的密码

2、允许远程连接

确保允许远程连接

3、检查防火墙设置

4、重置root密码

故障三:远程连接数据库时候偶尔会发生远程连接数据库很慢的问题

①故障现象:在使用远程连接数据库时候偶尔会发生远程连接数据库很慢的问题

②问题分析:DNS解析慢,客户端连接过多

③解决方法:

1、修改my.cnf主配置文件(增加skip-name-resolve)

2、数据库授权禁止使用主机名

故障四:无法打开文件:"xxx_forums"MY!'

①故障现象:

Can't open file:'xxx forums.MYl'.(errno: 145)

②问题分析:服务器非正常关机,数据库所在空间已满,或一些其它未知的原因,对数据库表造成了损坏。因拷贝数据库导致文件的属组发生变化,

③解决方法:

1、修复数据表

2、修改文件的属组

故障五:错误1129(HY000):主机“xxx.xxx.xxx”由于许多连接错误而被阻塞;请使用“mysqladmin flush-hosts”解除阻塞

①故障现象:

ERROR 1129 (HY000): Host 'xxx.xxx.xxx.xxx' is blocked because of manyconnection errors; unblock with 'mysqladmin flush-hosts'

②问题分析:超出最大连接错误数量限制

③解决方法:1、清除缓存(flush-hosts)

2、修改mysql配置文件(max_connect_errors=1000)

故障六:连接太多

①故障现象:

Too many connections

②问题分析:连接数超出mysql的最大连接限制

③解决方法:

1、修改mysql配置文件(max_connections=10000)

2、临时修改参数

故障七:警告:世界可写配置文件“/etc/my.cnf”被忽略了错误!MySQL正在
运行,但找不到PID文件

①故障现象:

Warning: World-writable config file /etc/my.cnf is ignoredERROR! MySQL is running but PiD file could not be found

②问题分析:MySQL的配置文件/etc/my.cnf权限问题

③解决方法:chmod 644 /etc/my.cnf

故障八:错误:第14178页日志序列号29455369832InnoDB:是在未来!当前系统日志序列号29455369832

①故障现象:

InnoDB: Error: page 14178 log sequence number 29455369832InnoDB: is in the future! Current system log sequence number 29455369832

②问题分析:innodb数据文件损坏

③解决方法:

1、修改my.cnf配置文件(innodb_force_recovery=4)

2、启动数据库后备份数据文件

3、利用备份文件恢复数据

故障九:从!/o线程停止,因为主线程和从线程具有相同的MySQL服务器id;这些id必须不同才能进行复制(或者必须在从丝编辑上使用--replicate-same-server-id选项)但这并不总是有意义的;使用前请查看说明书)。

①故障现象:从库的slave_IO_Running为NO

The slave l/0 thread stops because master and slave have equal MySQL serverids; these ids must be diferent for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense;please check the manual before using it).

②问题分析:主库和从库的server-id值一样

③解决方法:

1、修改从库的server-id的值,修改为和主库不一样

2、重新启动数据库并再次同步

故障十:mysql停止奴隶;编辑设置全局SQL SLAVE_SKIP_COUNTER=1;

①故障现象:从库的slave_IO_Running为NO

②问题分析:主键冲突或者主库删除或更新数据,从库内找不到记录,数据被修改导致

③解决方法:

方法一:

mysql> stop slave;mysqI> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;mysql> start slave;

方法二:

set global read only=true,

故障十一:初始化中继日志位置时出错:I/0从二进制日志读取头时出错

①故障现象:

Error initializing relay log position: l/O error reading the header from the binary
log

②问题分析:从库的中继日志relay-bin损坏

③解决方法:手工修复,重新找到同步的binlog和pos点,然后重新同步即可

mysqI> CHANGE MASTER TO MASTER LOG FILE='mysqlbin.xxx',MASTER LOG POS=xxx;

举报

相关推荐

0 条评论