# Mysql

介绍mysql 常用的操作及解决问题

# 解决主从同步延迟方案

# 主从同步延迟解决方案

[![image-1655083672395.png](http://wiki.shopqorg.com/uploads/images/gallery/2022-06/scaled-1680-/image-1655083672395.png)](http://wiki.shopqorg.com/uploads/images/gallery/2022-06/image-1655083672395.png)

#### 延迟参数调优

[![image-1655083789183.png](http://wiki.shopqorg.com/uploads/images/gallery/2022-06/scaled-1680-/image-1655083789183.png)](http://wiki.shopqorg.com/uploads/images/gallery/2022-06/image-1655083789183.png)

[![image-1655083838878.png](http://wiki.shopqorg.com/uploads/images/gallery/2022-06/scaled-1680-/image-1655083838878.png)](http://wiki.shopqorg.com/uploads/images/gallery/2022-06/image-1655083838878.png)

[![image-1655083977150.png](http://wiki.shopqorg.com/uploads/images/gallery/2022-06/scaled-1680-/image-1655083977150.png)](http://wiki.shopqorg.com/uploads/images/gallery/2022-06/image-1655083977150.png)

# Mysql的count(*)和count(1)谁更快

[![image-1655086310176.png](http://wiki.shopqorg.com/uploads/images/gallery/2022-06/scaled-1680-/image-1655086310176.png)](http://wiki.shopqorg.com/uploads/images/gallery/2022-06/image-1655086310176.png)

# mysql 主从配置

**change master to master\_host='127.0.0.1',**  
**master\_port=3308,**  
**master\_user='fingernft',**  
**master\_password='abc123.',**  
**master\_log\_file='binlog.000033', -- 主库日志名**  
**master\_log\_pos=509672;**

### <span style="text-decoration: underline;">***slave\_skip\_errors***</span>

 1007： 数据库已存在，创建数据库失败  
 1008： 数据库不存在，删除数据库失败  
 1050： 数据表已存在，创建数据表失败  
 1051： 数据表不存在，删除数据表失败  
 1054： 字段不存在，或程序文件跟数据库有冲突  
 1060： 字段重复，导致无法插入  
 1061： 重复键名  
 1068： 定义了多个主键  
 1094： 位置线程ID  
 1146： 数据表缺失，请恢复数据库  
 1053： 复制过程中主服务器宕机  
 1062： 主键冲突 Duplicate entry '%s' for key %d

# mysql 操作

***ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql\_native\_password BY '123456';***

***CREATE USER <span class="token string">'repliceof'</span>@<span class="token string">'172.18.140.7'</span> IDENTIFIED WITH mysql\_native\_password BY <span class="token string">'repliceof123.'</span><span class="token punctuation">;</span>***

***grant SELECT,UPDATE,DELETE,INSERT,ALTER,CREATE on test\_grant.\* to 'testuser1'@'%' with grant option;***

***\## 新建复制用户***

***GRANT REPLICATION SLAVE ON \*.\* TO 'testuser1'@'%' with grant option;***

***\## 忘记密码【skip-grant-tables】***

***先执行 flush privileges;***

***再执行 set password for 'root'@'localhost'=‘123456’；***

# mysql 新增用户及授权

***首次安装登录后修改密码：***

<span style="background-color: #000000; color: #e03e2d;">***ALTER USER USER() IDENTIFIED BY '123456789';***</span>

***之后登录密码：***

```
ALTER USER 'nacos'@'10.73.94.84' IDENTIFIED WITH mysql_native_password BY 'nacos';
```

<div class="md-code-block md-code-block-light" id="bkmrk-"><svg class="_9bc997d _33882ae" fill="none" height="12" viewbox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg><svg class="_9bc997d _28d7e84" fill="none" height="12" viewbox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg></div>***CREATE USER <span style="background-color: #000000; color: #e03e2d;">'username'@'host'</span> IDENTIFIED WITH mysql\_native\_password BY 'password';***

授权：

我们在使用mysql的过程中，经常需要对用户授权（添加，修改，删除),在mysql当中有三种方式实现 分别是 INSERT USER表的方法、CREATE USER的方法、GRANT的方法。今天主要看一下grant方法是如何实现的

分两种情况，第一种先使用create user命令创建用户，然后grant授权；第二种直接使用grant创建并授权；我们先看第一种如何实现

查看用户权限

show grants for 你的用户  
比如：

show grants for root@'localhost';  
一. 创建用户  
命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password';

> 说明： username：你将创建的用户名  
> host：指定该用户在哪个主机上可以登陆，如果是本地用户可用localhost，如果想让该用户可以从任意远程主机登陆，可以使用通配符%  
> password：该用户的登陆密码，密码可以为空，如果为空则该用户可以不需要密码登陆服务器

例子：  
CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456';  
CREATE USER 'pig'@'192.168.1.101\_' IDENDIFIED BY '123456';  
CREATE USER 'pig'@'%' IDENTIFIED BY '123456';  
CREATE USER 'pig'@'%' IDENTIFIED BY '';  
CREATE USER 'pig'@'%';  
二. 授权:  
命令:

GRANT privileges ON databasename.tablename TO 'username'@'host'

> 说明: privileges：用户的操作权限，如SELECT，INSERT，UPDATE等，如果要授予所的权限则使用ALL  
> databasename：数据库名 tablename：表名，如果要授予该用户对所有数据库和表的相应操作权限则可用表示，如.\*

例子:

GRANT SELECT, INSERT ON test.user TO 'pig'@'%';  
GRANT ALL ON \*.\* TO 'pig'@'%';

> 上面的第一行代码表示在test库中的user 授权pid用户，授权插入和选择操作;第二行表示授权pid用户可以操作所有的权限；

注意: 用以上命令授权的用户不能给其它用户授权，如果想让该用户可以授权，用以下命令:

GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;  
三.设置与更改用户密码  
SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');  
如果是当前登陆用户用:

SET PASSWORD = PASSWORD("newpassword");  
例子:  
SET PASSWORD FOR 'pig'@'%' = PASSWORD("123456");  
四. 撤销用户权限  
命令:  
REVOKE privilege ON databasename.tablename FROM 'username'@'host';  
说明:  
privilege, databasename, tablename：同授权部分  
例子:  
REVOKE SELECT ON \*.\* FROM 'pig'@'%';

> 注意: 假如你在给用户’[pig](https://so.csdn.net/so/search?q=pig&spm=1001.2101.3001.7020)’@’%‘授权的时候是这样的（或类似的）：
> 
> GRANT SELECT ON test.user TO ‘pig’@’%’，则在使用REVOKE SELECT ON . FROM ‘pig’@’%’;
> 
> 命令并不能撤销该用户对test数据库中user表的SELECT 操作。相反，如果授权使用的是
> 
> GRANT SELECT ON . TO ‘pig’@’%’;则REVOKE SELECT ON test.user FROM ‘pig’@’%’;
> 
> 命令也不能撤销该用户对test数据库中user表的Select权限。
> 
> 具体信息可以用命令SHOW GRANTS FOR ‘pig’@’%’; 查看。

删除用户  
命令:  
DROP USER 'username'@'host';

> 第一种介绍完了，我们现在看第二种直接使用grant创建并授权用户操作  
> 授权格式：grant 权限 on 数据库. to 用户名@登录主机 identified by “密码”;  
> 通过GRANT命令创建用户  
> 个人习惯一般用这种方法进行创建用户，当数据库存在用户的时候GRANT会对用户进行授权，但当数据库不存在该用户的时候，就会创建相应的用户并进行授权。\*

复制代码  
GRANT &lt;ALL|priv1,priv2,.....privn&gt; ON

\[object\] \[IDENTIFIED BY 'password'\]

\[WITH GRANT OPTION\];

MAX\_QUERIES\_PER\_HOUR count

MAX\_UPDATES\_PER\_HOUR count

MAX\_CONNECTIONS\_PER\_HOUR count

MAX\_USER\_CONNECTIONS count

复制代码  
说明：priv代表权限select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file等14个权限

例子：

mysql&gt;grant select,insert,update,delete,create,drop on test.hr to john@192.168.10.1 identified by '123';  
说明：给主机为192.168.10.1的用户john分配可对数据库test的hr表进行select,insert,update,delete,create,drop等操作的权限，并设定口令为123。

mysql&gt;grant all privileges on test.\* to joe@192.168.10.1 identified by '123';  
说明：给主机为192.168.10.1的用户john分配可对数据库test所有表进行所有操作的权限，并设定口令为123。

mysql&gt;grant all privileges on \*.\* to john@192.168.10.1 identified by '123';

说明：给主机为192.168.10.1的用户john分配可对所有数据库的所有表进行所有操作的权限，并设定口令为123。

mysql&gt;grant all privileges on \*.\* to john@localhost identified by '123';

说明：用户john分配可对所有数据库的所有表进行所有操作的权限，并设定口令为123。

四、直接向mysql.user表插入记录（该方法个人很少用）  
因为数据库的用户信息都是保存在mysql.user这张表的，所以直接对该表进行插入语句，即可完成用户的创建；

mysql&gt; insert into user (host,user,password) values ('%','john',password('123'));

# mysql 主从复制开启gtid 问题

开启gtid 后 mybatis 拦截【

<span style="color: #000000;"> </span><span style="color: #646464;">@Signature</span><span style="color: #000000;">(method = </span><span style="color: #2a00ff;">"update"</span><span style="color: #000000;">, type = Executor.</span><span style="color: #7f0055; font-weight: bold;">class</span><span style="color: #000000;">, args = {MappedStatement.</span><span style="color: #7f0055; font-weight: bold;">class</span><span style="color: #000000;">, Object.</span><span style="color: #7f0055; font-weight: bold;">class</span><span style="color: #000000;">}),</span>

】

所有表必须支持事务 ，不然会报错

**跳过 gtid 错误<span style="background-color: rgb(255, 255, 255);">【<span style="color: rgb(224, 62, 45);">只限于数据不那么重要的】</span></span>，最好是把主数据库数据克隆一份重新导入从库。**

```bash
#!/bin/bash
GTID_UUID="f948cd3e-6d1a-11ef-9cb9-005056b226a6"
START=181910008
END=189908868
MYSQL_USER="root"
MYSQL_PASS="Crrcsf,123"

mysql -u$MYSQL_USER -h 10.73.94.84 -p$MYSQL_PASS -e "STOP SLAVE;"

for ((i=START; i<=END; i++)); do
  echo "Skipping GTID: $GTID_UUID:$i"
  mysql -u$MYSQL_USER -h 10.73.94.84  -p$MYSQL_PASS -e "
    SET  GTID_NEXT='$GTID_UUID:$i';
    BEGIN; COMMIT;
  "
done

mysql -u$MYSQL_USER -h 10.73.94.84 -p$MYSQL_PASS -e "
  SET  GTID_NEXT='AUTOMATIC';
  START SLAVE;
"


```

# 放弃人逻辑

<div drawio-diagram="130"><img src="http://wiki.shopqorg.com/uploads/images/drawio/2023-12/drawing-1-1703314830.png" alt=""/></div>

[![973aaf756e5c7bad3cdcba382a7351e.png](http://wiki.shopqorg.com/uploads/images/gallery/2023-11/scaled-1680-/973aaf756e5c7bad3cdcba382a7351e.png)](http://wiki.shopqorg.com/uploads/images/gallery/2023-11/973aaf756e5c7bad3cdcba382a7351e.png)

[![1700120858006.jpg](http://wiki.shopqorg.com/uploads/images/gallery/2023-11/scaled-1680-/1700120858006.jpg)](http://wiki.shopqorg.com/uploads/images/gallery/2023-11/1700120858006.jpg)

[![1700120970581.jpg](http://wiki.shopqorg.com/uploads/images/gallery/2023-11/scaled-1680-/1700120970581.jpg)](http://wiki.shopqorg.com/uploads/images/gallery/2023-11/1700120970581.jpg)

[![1700121011952.jpg](http://wiki.shopqorg.com/uploads/images/gallery/2023-11/scaled-1680-/1700121011952.jpg)](http://wiki.shopqorg.com/uploads/images/gallery/2023-11/1700121011952.jpg)

# 查看所有表注释

### 查看所有表注释

#### *SELECT TABLE\_NAME, TABLE\_COMMENT FROM INFORMATION\_SCHEMA.TABLES WHERE TABLE\_SCHEMA = 'ereport\_test';*