linux服务器CPU飙升解决办法_MYSQL
1.top//终端输入命令查询进程#使用top命令查看CPU占用进程,确认mysql进程占用CPU资源过大2、首先考虑磁盘占用问题,清理日志文件释放空间df -h #查看磁盘空间占用du -h #查看当前文件夹或文件大小ls -lh $(find / -type f -size +100M) #查找大于100M的文件#检查清理nginx日志及其他日志文件。3、清除服务器缓存free -m #查看缓
1.top //终端输入命令查询进程
#使用top命令查看CPU占用进程,确认mysql进程占用CPU资源过大
2、首先考虑磁盘占用问题,清理日志文件释放空间
df -h #查看磁盘空间占用
du -h #查看当前文件夹或文件大小
ls -lh $(find / -type f -size +100M) #查找大于100M的文件
#检查清理nginx日志及其他日志文件。
3、清除服务器缓存
free -m #查看缓存的命令,其中buff/cache项为缓存占用
#清理缓存的命令
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
4、mysql 调优,数据库数据激增,数据表需要进行维护
show full processlist;
#文章表tbl_article数据量大,查询慢,根据state列查询状态,进行优化cpu消耗过大由于慢sql造成,慢sql包括全表扫描,扫描数据量太大,内存排序,磁盘排序,锁争用等
执行状态为:sending data,copying to tmp table,copying to tmp table on disk,sorting result,using filesort,locked
sending data #正从表中查询数据,如果查询条件没有适当索引,会导致sql执行时间过长
copying to tmp table on disk #因临时结果集太大,超过数据库规定的临时内存大小,需要拷贝临时结果集到磁盘上
sorting result,using filesort #正在执行排序操作,排序操作会引起较多的cpu消耗,可以通过添加索引,或减小排序结果集
locked #被其他查询锁住
命令:
show open tables;
#看当前有那些表是打开的。In_use列表示有多少线程正在使用某张表,Name_locked表示表名是否被锁
show open tables from tt_data;
#同上,指定数据库名为tt_data
show status like '%lock%';#查看服务器状态
show engine innodb status\G;
#查看innodb引擎的运行时信息
show variables like ‘%timeout%’;
#查看服务器配置参数。
查看表索引:
show index from tbl_article; #查看表中索引,根据查询语句进行优化
ALTER TABLE tbl_article ADD INDEX union_search(cateid,isopen,status,isrec,ishot); #对查询中使用的字段建立联合索引,按照查询语句中字段的查询顺序排列,提升查询效率
ALTER TABLE tbl_article ADD FULLTEXT fulltext_search (title, content); #对标题及内容字段建立全文检索索引,关于全文检索索引配置和使用下面
ALTER TABLE tbl_article RENAME old_index_name TO new_index_name;#索引名为了便于区分,mysql5.7及以上版本可以通过此命令修改索引名
ALTER TABLE tbl_article DROP INDEX old_index_name; #mysql5.7以下版本可以通过此命令修改索引名
ALTER TABLE tbl_article ADD INDEX new_index_name(column_name); #mysql5.7以下版本可以通过此命令修改索引名
REPAIR TABLE tbl_article QUICK;
5.关于全文检索
SHOW VARIABLES LIKE 'ft_min_word_len';#查询默认ft_min_word_len = 4,退出mysql,修改mysql配置
cat /etc/my.cnf #修改 ft_min_word_len = 2,保存后重启MYSQL,并修复全文索引
6.使用MySQL分页存储过程
/*****************************************************
MySQL分页存储过程
*****************************************************/
DROP PROCEDURE IF EXISTS pr_pager;
CREATE PROCEDURE pr_pager(
IN p_table_name VARCHAR(1024), /*表名*/
IN p_fields VARCHAR(1024), /*查询字段*/
IN p_page_size INT, /*每页记录数*/
IN p_page_now INT, /*当前页*/
IN p_order_string VARCHAR(128), /*排序条件(包含ORDER关键字,可为空)*/
IN p_where_string VARCHAR(1024), /*WHERE条件(包含WHERE关键字,可为空)*/
OUT p_out_rows INT /*输出记录总数*/
)
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT '分页存储过程'
BEGIN
/*定义变量*/
DECLARE m_begin_row INT DEFAULT 0;
DECLARE m_limit_string CHAR(64);
/*构造语句*/
SET m_begin_row = (p_page_now - 1) * p_page_size;
SET m_limit_string = CONCAT(' LIMIT ', m_begin_row, ', ', p_page_size);
SET @COUNT_STRING = CONCAT('SELECT COUNT(*) INTO @ROWS_TOTAL FROM ', p_table_name, ' ', p_where_string);
SET @MAIN_STRING = CONCAT('SELECT ', p_fields, ' FROM ', p_table_name, ' ', p_where_string, ' ', p_order_string, m_limit_string);
/*预处理*/
PREPARE count_stmt FROM @COUNT_STRING;
EXECUTE count_stmt;
DEALLOCATE PREPARE count_stmt;
SET p_out_rows = @ROWS_TOTAL;
PREPARE main_stmt FROM @MAIN_STRING;
EXECUTE main_stmt;
DEALLOCATE PREPARE main_stmt;
END;
- Mysql锁表问题
1)查询锁表问题
show open tables where in_use > 0
2)解除所有锁
unlock tables
3)锁表
lock tables data_map READ
更多推荐
所有评论(0)