MySQL使用技巧
mysql 修改密码
方法1: 用SET PASSWORD命令
首先登录MySQL。
格式:mysql> set password for 用户名@localhost = password(‘新密码’);
例子:mysql> set password for root@localhost = password(‘1234’);
方法2:用mysqladmin
格式:mysqladmin -u用户名 -p旧密码 password 新密码
例子:mysqladmin -uroot -p123456 password 123
方法3:用UPDATE直接编辑user表
首先登录MySQL。
mysql> use mysql;
mysql> update user set password=password(‘1234’) where user=’root’ and host=’localhost’;
mysql> flush privileges;
方法4:在忘记root密码的时候,可以这样
以windows为例:
- 关闭正在运行的MySQL服务。
- 打开DOS窗口,转到mysql\bin目录。
- 输入mysqld –skip-grant-tables 回车。–skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。
- 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。
- 输入mysql回车,如果成功,将出现MySQL提示符 >。
- 连接权限数据库: use mysql; 。
- 改密码:update user set password=password(“123”) where user=”root”;(别忘了最后加分号) 。
- 刷新权限(必须步骤):flush privileges; 。
- 退出 quit。
- 注销系统,再进入,使用用户名root和刚才设置的新密码123登录。
mysql 内部变量
- 查询数据库存储路径:
SHOW VARIABLES WHERE Variable_name LIKE '%datadir%';
初始化 Mysql
在更换 mysql 数据目录 datadir=~/mysql
后,可通过如下命令初始化 mysql 数据目录。
1 | # mysql-5.5 |
正则获取表名
1 | SELECT |
批量 kill mysql sql
直接执行 kill
操作是不优雅的,会有业务问题。
事由:
Alter table
引发的惨案。
遇到的情况是对业务日志处理,表大小: 100GB+
记录条数:7kw+
,Mysql 版本是:5.7.22-log
。
- 在执行新增字段时导致了锁表。
- 锁表后因还有此表相关
Insert into
SQL 执行,导致阻塞了 Mysql 所有的线程。显示用户正在运行的线程:show processlist;
或者select * from information_schema.processlist;
, 若要查看完成 SQL 可通过show full processlist
命令,这里提示一点只有root
用户能查询到所有的线程,其他用户只能查看到自己的线程。 - 相关业务受影响,服务端无法响应。
解决方案:
- 暂停日志记录。
- kill 掉所有与日志表相关的
Insert into
SQL。
通过以下命令查询表 <Table-Name>
相关的SQL。
1 | select * from information_schema.PROCESSLIST where Info like 'INSERT INTO <Table-Name>%'; |
按客户端 IP 分组,看哪个客户端的链接数最多
1
select client_ip,count(client_ip) as client_num from (select substring_index(host, ':', 1) as client_ip from processlist ) as connect_info group by client_ip order by client_num desc;
查看正在执行的线程,并按 Time 倒排序,看看有没有执行时间特别长的线程
1
select * from information_schema.processlist where Command != 'Sleep' order by Time desc;
找出所有执行时间超过 5 分钟的线程,拼凑出 kill 语句,方便后面kill
1
select concat('kill ', id, ';') from information_schema.processlist where Command != 'Sleep' and Time > 300 order by Time desc;
参考
MySQL Online DDL
Online DDL: MySQL >= 5.6.7
。
1 | alter table t_base_user modify telephone varchar(50), ALGORITHM=INPLACE, LOCK=NONE; |
LOCK 类型
- LOCK=EXCLUSIVE : 表示独占锁,DDL语句执行期间会阻塞该表的所有请求。
- LOCK=SHARED:共享锁,DDL语句执行期间会阻塞除查询外的所有DML操作,如: insert,update等。
- LOCK=NONE: 允许所有查询以及DML操作。
- LOCK=DEFAULT 默认级别,MySQL尽可能允许最大的并发操作。
当我们不显示指定时,默认就为LOCK=DEFAULT类型。
注:不是所有的DDL操作LOCK类型都可以指定为NONE的。如果DDL操作的类型,不能以请求的锁定类型执行,则会执行失败。
参考
MySQL 生成测试数据
1 | CREATE TABLE `test` ( |
参考
MySQL 8.0 安装完成后配置
查找
root
密码。1
2$ grep "A temporary password" /var/log/mysqld.log
2021-01-11T03:35:29.613489Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: d+CGdmfw;5/!设置
root
为简单密码。注意:设置成简单免密,只为了提高本地开发的便利性,若是修改线上服务器
root
账号密码,还是要设置个复杂点的密码以提高安全性。1
2
3
4set GLOBAL validate_password.policy=0;
SET GLOBAL validate_password.length=4;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234';开启外网访问权限。
1 | # 开启外网访问 |