mysqldump

1
2
3
# 备份单张表,同时启用gzip压缩
mysqldump -uroot -pdb191@b.x fund_trade account_share_logs | gzip > \ 
191_dump_20210918_104401.fund_trade.account_share_logs.sql.gz

定时任务备份crontab

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/bash

#33 02 * * * sh /home/mysql_bak_191.sh >> /home/bak_mysql_191.log 2>&1

bk_datetime=`date +%Y%m%d_%H%M%S`
back_path=/home/bmc/databases/auto_back

mysqldump -uroot -pxxxxxx | gzip > $back_path/dump.$bk_datetime.dxhj_oa.sql.gz

tar -czvPf - $back_path/dump.$bk_datetime.* |openssl des3 -salt -k passwd |dd of= \
$back_path/191_dump_$bk_datetime.mysql.des3

rm -rf $back_path/dump.$bk_datetime.*

scp -P 22334 $back_path/191_dump_$bk_datetime.mysql.des3 root@x.x.x.x:/backup

查询用户所有权限

1
2
3
-- 查询到用户对应访问IP的权限记录,然后针对每条user@ip记录查询权限
select * from mysql.user;
show grants for 'user-name'@'host'

表被锁定

1
2
-- 查询系统库中什么表被锁定了。
show OPEN TABLES where In_use > 0;

查询当前连接情况

1
2
3
4
# show 所有的连接
show processlist;
# 筛选条件
select * from information_schema.processlist where user = 'root';

执行语句不记录binlog

发现了比较诡异的事情,在服务器mysql控制台,修改表结构,主数据库生效了,但是从数据居然没有生效。查询了主数据库的binlog文件和从数据库的relaylog文件都没有找到这条语句。什么鬼?

1
2
3
4
5
-- SQL语句如下
ALTER TABLE dxhj_xxx.my_fund_index ADD base_cycle varchar(10) NULL DEFAULT '' COMMENT '';

# 最后在网上找到了这样的解释:在控制台下执行的跨库操作不记录binlog
# 上面我执行语句的时候,当前库不是dxhj_xxxsql语句中有库和表,语句能执行成功,但此时不记录binlog

切记!切记!切记!

表空间占用统计

1
2
3
4
5
-- 整个库的所有表全部统计出来了
select table_schema,table_name, table_rows, (data_length + index_length) as len,
concat(round((data_length + index_length)/1024/1024, 2), 'MB') as datas
from information_schema.tables
order by len desc;

删除表中数据

程度从强到弱

1、drop table tb

drop将表格直接删除,没有办法找回

2、truncate (table) tb

删除表中的所有数据,不能与where一起使用

3、delete from tb (where)

删除表中的数据(可制定某一行)

区别:truncate和delete的区别

  1. 事务:truncate是不可以rollback的,但是delete是可以rollback的; 原因:truncate删除整表数据(ddl语句,隐式提交),delete是一行一行的删除,可以rollback
  2. 效果:truncate删除后将重新水平线和索引(id从零开始) ,delete不会删除索引
  3. truncate 不能触发任何Delete触发器。
  4. delete 删除可以返回行数

MySQL配置参数

涉及参数 –skip-name-resolve ,–skip-host-cache ,–skip-networking

当新的客户连接mysqld时,mysqld创建一个新的线程来处理请求。该线程先检查是否主机名在主机名缓存中。如果不在,线程试图解析主机名:

  • 如果操作系统支持线程安全gethostbyaddr_r ()和gethostbyname_r()调用,线程使用它们来执行主机名解析。
  • 如果操作系统不支持线程安全调用,线程锁定一个互斥体并调用gethostbyaddr()和gethostbyname()。在这种情况下,在第1个线程解锁互斥体前,没有其它线程可以解析不在主机名缓存中的主机名。

你可以用**–skip-name-resolve**选项启动mysqld来禁用DNS主机名查找。然而,在这种情况下,你只可以使用MySQL中的授权表中的IP号。如果你有一个很慢的DNS和许多主机,你可以通过用–skip-name-resolve禁用DNS查找或增加HOST_CACHE_SIZE定义(默认值:128)并重新编译mysqld来提高性能。

你可以用**–skip-host-cache**选项启动服务器来禁用主机名缓存。要想清除主机名缓存,执行**FLUSH HOSTS**语句或执行**mysqladmin flush-hosts**命令。

如果你想要完全禁止TCP/IP连接,用**–skip-networking**选项启动mysqld。

Use Database很卡

在普通控制台登录状态下,当数据库中表比较多,且单表又比较大时,执行这个 use databases 指令就会很卡 ( 也跟机器性能有很大关系 )。此时需要在登录的时候加入一个-A的参数,跳过一些检查。

1
shell > mysql -A -uroot -ppassword

MySQL读写分离

参考:

https://juejin.cn/post/7388091090349490202

https://mp.weixin.qq.com/s/ZQTKyD2DSbUqlZcrZrVExQ

(完)