MySQL运维中的Tips--持续更新

1、into outfile 生成sql:一般都是生成文本或者其他形式的文件,现在需要生成sql形式的文件。
配置文件加
secure_file_priv=''
select concat('insert into tab_name(id,name,age) values(',id,',','\'',name,'\'',',','\'',age,'\'',');') into outfile '/tmp/tab_name.txt' from tab_name;

create table tab_name(id int primary key auto_increment, name varchar(20), age varchar(10));
insert into tab_name(id,name,age) values(1,'aaa','23');
insert into tab_name(id,name,age) values(2,'aaa','23');
insert into tab_name(id,name,age) values(3,'aaa','23');
insert into tab_name(id,name,age) values(4,'aaa','23');
insert into tab_name(id,name,age) values(6,'aaa','23');

 

2、在show processlist显示的状态里面,update表示正在insert ,updating表示正在delete,Updating才是表示正在update。

+-----+------+-----------+------+---------+------+----------------+----------------+
| Id  | User | Host      | db   | Command | Time | State          | Info           |
+-----+------+-----------+------+---------+------+----------------+----------------+
| 322 | root | localhost | test | Query   |    1 | updating       | delete from ...|
| 322 | root | localhost | test | Query   |   18 | Updating       | update      ...|
| 322 | root | localhost | test | Query   |   49 | update         | insert into ...|
+-----+------+-----------+------+---------+------+----------------+----------------+

 

3、清除Slave信息:在5.5之后新增了一个命令:reset slave all,可以清除Slave的所有信息。

 

4、SET global slave_type_conversions=ALL_NON_LOSSY 。碰到主从同步失败,原因是在运行 pt-online-schema-change 进行DDL修改字段操作的时候,从的一个字段长度和主的字段长度不一致导致的。
主从同步失败的错误信息:
Slave SQL: Column 31 of table 'test.tbname' cannot be converted from type 'varchar(765)' to type 'varchar(512)
解决办法:先stop slave,再通过设置slave_type_conversions=ALL_NON_LOSSY,最后再start slave 解决。
通过上面的问题可以得到一个经验:MySQL在做DDL并且主从切换(高可用)的时候,需要保证不要因为上面的原因而出现异常。

 

5、慢查询统计

按天:
grep  Time: mysql-slow-3306.log | awk '{print $3}'|awk '{a[$1]++}END{for (j in a) print j,": " a[j]}' | sort -nrk2 -t:
按小时:
grep  Time: mysql-slow-3306.log | awk '{print $3,$4}'|awk -F : '{print $1}' | awk -F : '{a[$1]++}END{for (j in a) print j,": " a[j]}' | sort -nrk2 -t:
按分钟:
grep  Time: mysql-slow-3306.log | awk '{print $3,$4}'|awk -F : '{print $1,$2}' | awk -F : '{a[$1]++}END{for (j in a) print j,": " a[j]}' | sort -nrk2 -t:

解释:

awk '{a[$1]++}END{for (j in a) print a[j],j}' a.txt
a[$1]++这里用到了awk的数组,数组a的下标为$1,并将相同的相加,会遍历a.txt $1
遍历完成后,通过END把后面的句子连起来
for (j in a) 是指打印数组a的下标,并定义下标为变量j
最后print a[j],j就是打印数组下标和数组,这样就相同的$1排重并计数

 

6、set autocommit = 0 是将本线程设置为非自动提交模式。下个语句开始时自动新建一个事务,会隐含了一个begin操作

 

7、character-set-client-handshake,该参数的作用是在连接MySQL时,是否忽视其指定的字符集,使用数据库默认(character-set-server)的字符集。用 --skip-character-set-client-handshake来指定忽视。如:在配置文件的mysqld选项组下面添加:

skip-character-set-client-handshake

之后通过mysql连接指定任何字符集(--default-character-set=utf8/gbk/latin1)都无效,数据库只是用(character-set-server)设置的字符集。可以有效的避免客户端程序误操作,使用其他字符集连接进来并写入数据,从而引发乱码问题。

 

8、MySQL5.7内存使用监控(OOM)

通过performance_schema里的表定位:
MySQL 5.7的库performance_schema新增了以下这几张表,用于从各维度查看内存的消耗:
memory_summary_by_account_by_event_name
memory_summary_by_host_by_event_name  
memory_summary_by_thread_by_event_name
memory_summary_by_user_by_event_name    
memory_summary_global_by_event_name
简单来说,就是可以根据用户、主机、线程、账号、全局的维度对内存进行监控。同时库sys也就这些表做了进一步的格式化,可以使得用户非常容易的观察到每个对象的内存开销,默认情况下performance_schema只对performance_schema进行了内存开销的统计。但是在对OOM进行诊断时,需要对所有可能的对象进行内存监控。因此,还需要做下面的设置:
mysql> update performance_schema.setup_instruments set enabled = 'yes' where name like 'memory%';
但是这种在线打开内存统计的方法仅对之后新增的内存对象有效
如想要对全局生命周期中的对象进行内存统计,必须在配置文件中进行设置,然后重启:
[mysqld]
performance-schema-instrument='memory/%=COUNTED'

查看消耗的内存(需要分配的)

mysql> select event_name,SUM_NUMBER_OF_BYTES_ALLOC/1024/1024 from memory_summary_global_by_event_name order by SUM_NUMBER_OF_BYTES_ALLOC desc limit 10;
+--------------------------------------------------------------------+-------------------------------------+
| event_name                                                         | SUM_NUMBER_OF_BYTES_ALLOC/1024/1024 |
+--------------------------------------------------------------------+-------------------------------------+
| memory/innodb/buf_buf_pool                                         |                       3144.00000000 |
| memory/innodb/hash0hash                                            |                         83.70404053 |
| memory/performance_schema/events_statements_summary_by_digest      |                         39.67285156 |
| memory/sql/JOIN_CACHE                                              |                         36.00000000 |
| memory/performance_schema/events_errors_summary_by_thread_by_error |                         35.05664063 |
| memory/innodb/ut0new                                               |                         32.07868385 |
| memory/mysys/KEY_CACHE                                             |                         32.00141907 |
| memory/sql/TABLE                                                   |                         30.14540100 |
| memory/sql/dd::String_type                                         |                         29.45692062 |
| memory/innodb/ut0link_buf                                          |                         24.00004578 |
+--------------------------------------------------------------------+-------------------------------------+
10 rows in set (0.00 sec) 

 

9、查看哪些事务长时间没有提交:如10秒

select a.trx_mysql_thread_id,b.TIME from information_schema.INNODB_TRX a inner join information_schema.processlist b on a.trx_mysql_thread_id=b.id where a.trx_state='RUNNING' and b.time>10 and b.COMMAND='Sleep';

 

10、使用gdb不登入MySQL直接设置连接数

gdb -p $(cat /app/mysqldata/3306/data/mydb1.pid) -ex "set max_connections=5000" -batch

 

 

鉴权

show grants for 'root'@'localhost';

 

 

 

手册,重要章节通读一遍

边学习理论,边动手实践

有条件的话,边学习源码边动手实践验证

遇到问题时,先观察日志,自主思考可能的原因。实在无果后,提供详细信息向别人耐心请教

 

posted @ 2019-08-16 18:31  AllenHU320  阅读(360)  评论(0编辑  收藏  举报