---
title: MySQL
date: 2023-09-23 10:30:31
author: 文永达
top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/67239FBB-E15D-4F4F-8EE8-0F1C9F3C4E7C.jpeg
---



# mysqldump备份数据库

## 备份实例下的所有库

```shell
mysqldump -uroot -p -A > all.sql
```

## 备份单个指定数据库

```shell
mysqldump -uroot -p test > test.sql
```

## 备份多个指定数据库

```shell
mysqldump -uroot -p test1 test2 > test12.sql
```

## 备份指定数据库中的单个表

```shell
mysqldump -uroot -p test user > test.user.sql
```

## 备份指定数据库中的多个表

```shell
mysqldump -uroot -p test user role > test.ur.sql
```

## 备份数据库表结构只包含DDL语句

```shell
# --no-data 或 -d
mysqldump -uroot -p test --no-data > test.sql
```

## 备份数据库带库名

```shell
mysqldump -uroot -p -B test > test.sql
```

# Xtrabackup备份数据库

## 安装

### wget方式

1. 安装qpress rpm包。
   ```shell
   wget https://repo.percona.com/yum/release/7/RPMS/x86_64/qpress-11-1.el9.x86_64.rpm
   rpm -ivh qpress-11-1.el9.x86_64.rpm
   ```
   
2. 安装Percona XtraBackup

   - MySQL 5.6、5.7，以下载并安装Percona XtraBackup 2.4.9为例
     ```shell
     wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.29/binary/redhat/9/x86_64/percona-xtrabackup-24-2.4.29-1.el9.x86_64.rpm
     
     rpm -ivh percona-xtrabackup-24-2.4.29-1.el9.x86_64.rpm
     
     warning: percona-xtrabackup-24-2.4.29-1.el9.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 8507efa5: NOKEY
     error: Failed dependencies:
             libatomic.so.1()(64bit) is needed by percona-xtrabackup-24-2.4.29-1.el9.x86_64
             libev.so.4()(64bit) is needed by percona-xtrabackup-24-2.4.29-1.el9.x86_64
             perl(DBD::mysql) is needed by percona-xtrabackup-24-2.4.29-1.el9.x86_64
             rsync is needed by percona-xtrabackup-24-2.4.29-1.el9.x86_64
     
     dnf install libatomic -y
     dnf install libev -y
     dnf install -y rsync
     dnf install perl-DBD-MySQL
     
     ```
     
   - MySQL 8.0，以下载并安装Percona XtraBackup 8.0为例
     ```shell
     wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.32-26/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.32-26.1.el7.x86_64.rpm
     
     rpm -ivh percona-xtrabackup-80-8.0.32-26.1.el7.x86_64.rpm --nodeps --force
     ```

## 备份

#### 全量备份

```shell
innobackupex --user=root --password=123456 --host=127.0.0.1 ~/mysql_bakup/

#语法解释说明：
#--user=root 指定备份用户
#--password=123456  指定备份用户密码
#--host　　指定主机
#~/mysql_bakup/　　指定备份目录
```

执行命令后。可看到备份时间的文件夹

![image-20240130140632864](MySQL/image-20240130140632864.png)

文件夹内容如下

![image-20240130140723465](MySQL/image-20240130140723465.png)

#### 差异备份

首先需要全量备份一次

```shell
innobackupex --user=root --password=123456 --host=127.0.0.1 ~/mysql_bakup/
```

然后按照全量备份生成的备份目录为基础

```shell
innobackupex --user=root --password=123456 --host=127.0.0.1 --incremental ~/mysql_bakup/ --incremental-basedir=~/mysql_bakup/2024-01-30_14-03-42/
```

![image-20240130151257100](MySQL/image-20240130151257100.png)

差异备份需要使用参数--incremental指定需要备份到哪个目录，使用incremental-dir指定全备目录

查看备份数据

![image-20240130172206916](MySQL/image-20240130172206916.png)

## 恢复

#### 全量备份恢复

```shell
# 停止目标服务器上的mysql
systemctl stop mysqld
```

![image-20240130142057208](MySQL/image-20240130142057208.png)

同步服务器上的备份文件至本地

```shell
# 同步服务器上的备份文件夹至本地
rsync -av root@10.0.3.3::mysql_bakup ~/mysql_bakup
```

![image-20240130142150299](MySQL/image-20240130142150299.png)

创建本地数据目录备份

```shell
cp -r /var/lib/mysql /var/lib/mysqlbakup
```

合并数据日志，使数据文件处于一致性的状态

```shell
innobackupex --apply-log ~/mysql_bakup/2024-01-30_14-03-42/ 
```

![image-20240130142410127](MySQL/image-20240130142410127.png)

删除数据目录

```shell
rm -rf /var/lib/mysql
```

进行数据恢复

```shell
innobackupex --copy-back 2024-01-30_14-03-42/
```

![image-20240130142551097](MySQL/image-20240130142551097.png)

赋予权限

```shell
chown mysql:mysql /var/lib/mysql -R
```

临时关闭SELinux

```she
setenforce 0
```

永久关闭SELinux

#### 差异备份恢复

```shell
# 停止目标服务器上的mysql
systemctl stop mysqld
```

![image-20240130142057208](MySQL/image-20240130142057208.png)

删除数据目录

```shell
rm -rf /var/lib/mysql
```

合并全备数据目录，确保数据的一致性

```shell
innobackupex --apply-log --redo-only ~/mysql_bakup/2024-01-30_14-03-42/
```

将差异备份数据合并到全备数据目录当中

```shell
innobackupex --apply-log --redo-only ~/mysql_bakup/2024-01-30_14-03-42/ --incremental-dir=~/mysql_bakup/2024-01-30_15-12-28/
```

恢复数据

```shell
innobackupex --copy-back ~/mysql_bakup/2024-01-30_14-03-42/
```

赋予权限

```shell
chown mysql:mysql /var/lib/mysql -R
```

临时关闭SELinux

```she
setenforce 0
```

永久关闭SELinux

# Windows 下安装 绿色版

先下载[MySQL :: Download MySQL Community Server](https://dev.mysql.com/downloads/mysql/)

![image-20231007124717167](https://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20231007124717167.png)

1. 解压下载好的压缩包
   ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210120105901505.png#pic_left)

2. 解压后得到
   ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210120105247435.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NXZVFpbg==,size_16,color_FFFFFF,t_70#pic_center)

3. 新建一个 `my.ini`文件
   ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210120110525427.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NXZVFpbg==,size_16,color_FFFFFF,t_70#pic_center)

4. 解压后的mysql根目录下没有my.ini文件，自己去网上找一份就可或者使用我在后面给出的代码。.ini文件会在初始化mysql中用到
   ```ini
   # For advice on how to change settings please see
   # http=//dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
   # *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
   # *** default location during install, and will be replaced if you
   # *** upgrade to a newer version of MySQL.
   
   [client]
    port = 3306
    default-character-set = utf8
   
   [mysqld]
    
   # Remove leading # and set to the amount of RAM for the most important data
   # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
   # innodb_buffer_pool_size = 128M
    
   # Remove leading # to turn on a very important data integrity option= logging
   # changes to the binary log between backups.
   # log_bin
   port = 3306 
   # These are commonly set, remove the # and set as required.
   basedir="D:\app\mysql-5.7.43-winx64"
   datadir="D:\app\mysql-5.7.43-winx64\data"
   # server_id = .....
   character_set_server = utf8
    
   # Remove leading # to set options mainly useful for reporting servers.
   # The server defaults are faster for transactions and fast SELECTs.
   # Adjust sizes as needed, experiment to find the optimal values.
   # join_buffer_size = 128M
   # sort_buffer_size = 2M
   # read_rnd_buffer_size = 2M 
    
   sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
   
   ```

5. 修改ini配置文件中的安装目录和数据存放目录修改为mysql文件的路径

6. \#设置mysql的安装目录
   basedir=D:\app\mysql-5.7.43-winx64
   \#设置mysql数据库的数据的存放目录
   datadir=D:\app\mysql-5.7.43-winx64\data

7. 打开cmd，初始化数据库
   ```powershell
   mysqld --initialize 
   ```

8. 初始化完成后，mysqld根目录下会自动新增data文件夹
   ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210120153744844.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NXZVFpbg==,size_16,color_FFFFFF,t_70#pic_center)

9. 打开data文件夹，找到.err后缀文本打开
   ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210120153933128.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NXZVFpbg==,size_16,color_FFFFFF,t_70#pic_center)

10. 找到文件password位置，红色框中为数据库初始化密码，后续修改初始化密码使用
    ```err
    2023-10-07T04:37:02.330654Z 1 [Note] A temporary password is generated for root@localhost: (iw?Mw:Vs7n&
    ```

11. 安装数据库
    ```powershell
    mysqld --install <服务名>
    ```

12. 启动服务
    ```powershell
    net start mysql
    ```

13. 关闭服务
    ```powershell
    net stop mysql
    ```

14. 修改初始密码

    - 登录
      ```powershell
      mysql -uroot -p'你的初始密码，步骤4中红框里的字符'
      ```

    - 修改密码为 123456
      ```mysql
       ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
      ```

15. 服务卸载
    ```powershell
    net stop mysql
    mysqld --remove
    ```

# Linux 安装MySQL

## 安装

1. 在浏览器下载Linux系统的MySQL客户端安装包。建议您下载的MySQL客户端版本高于已创建的GaussDB(for MySQL)实例中数据库版本。
    在下载页面找到对应版本[链接](https://dev.mysql.com/downloads/file/?id=496982)，以mysql-community-client-8.0.21-1.el6.x86_64为例，打开页面后，即可下载安装包。
    ![img](MySQL/zh-cn_image_0000001729034977.png)

2. 将安装包上传到ECS。

3. 执行以下命令安装MySQL客户端。
   rpm -ivh mysql-community-client-8.0.21-1.el6.x86_64.rpm

   > - 如果安装过程中报conflicts，可增加replacefiles参数重新安装，如下：
   >
   >   rpm -ivh --replacefiles mysql-community-client-8.0.21-1.el6.x86_64.rpm
   >
   > - 如果安装过程中提示需要安装依赖包，可增加nodeps参数重新安装，如下：
   >
   >   rpm -ivh --nodeps mysql-community-client-8.0.21-1.el6.x86_64.rpm

## 连接

1. **mysql -h** <*host*> **-P** *<port>* **-u** <*userName*> **-p**
   示例：

   mysql -h 192.168.0.16 -P 3306 -u root -p

   参数说明

   | 参数         | 说明                         |
   | ------------ | ---------------------------- |
   | <*host*>     | 获取的读写内网地址。         |
   | *<port>*     | 获取的数据库端口，默认3306。 |
   | <*userName*> | 管理员帐号root。             |

2. 出现如下提示时，输入数据库帐号对应的密码。
   ```mysql
   Enter password:
   ```

3. 报错mysql: error while loading shared libraries: libssl.so.10: cannot open shared object file: No such file or directory

   下载rpm包:
   https://mirrors.aliyun.com/centos/8/AppStream/x86_64/os/Packages/compat-openssl10-1.0.2o-3.el8.x86_64.rpm
   安装rpm包:

   ```shell
   rpm -i compat-openssl10-1.0.2o-3.el8.x86_64.rpm 
   错误：依赖检测失败：
   	make 被 compat-openssl10-1:1.0.2o-3.el8.x86_64 需要
   rpm -i compat-openssl10-1.0.2o-3.el8.x86_64.rpm --nodeps --force
   
   mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
   cp /usr/lib64/libncurses.so.6 /usr/lib64/libncurses.so.5
   
   mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
   cp /usr/lib64/libtinfo.so.6 /usr/lib64/libtinfo.so.5
   ```
   
   

# Linux 卸载MySQL

## 二进制方式

```shell
rpm -qa | grep -i mysql

# 如下所示
mysql-community-release-el7-5.noarch
mysql-community-libs-5.6.51-2.el7.x86_64
mysql-community-client-5.6.51-2.el7.x86_64
mysql-community-server-5.6.51-2.el7.x86_64
mysql-community-common-5.6.51-2.el7.x86_64

systemctl stop mysqld

rpm -ev mysql-community-release-el7-5.noarch
rpm -ev mysql-community-libs-5.6.51-2.el7.x86_64
rpm -ev mysql-community-client-5.6.51-2.el7.x86_64
rpm -ev mysql-community-server-5.6.51-2.el7.x86_64
rpm -ev mysql-community-common-5.6.51-2.el7.x86_64

find / -name mysql

# 如下所示
/var/lib/mysql
/var/lib/mysql/mysql
/usr/local/mysql
/usr/lib64/mysql
/usr/share/mysql
/usr/bin/mysql
/etc/logrotate.d/mysql
/etc/selinux/targeted/active/modules/100/mysql

rm -rf /var/lib/mysql
rm -rf /var/lib/mysql/mysql
rm -rf /usr/local/mysql
rm -rf /usr/lib64/mysql
rm -rf /usr/share/mysql
rm -rf /usr/bin/mysql
rm -rf /etc/logrotate.d/mysql
rm -rf /etc/selinux/targeted/active/modules/100/mysql

rm -rf /etc/my.cnf

rpm -qa | grep -i mysql
```



# MySQL 客户端

执行脚本

```mysql
source <脚本绝对路径>
```

# 用户和权限

## 用户各项权限

```mysql
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
GRANT Usage ON *.* TO 'username'@'%';
GRANT Alter ON database.* TO 'username'@'%';
GRANT Create ON database.* TO 'username'@'%';
GRANT Create view ON database.* TO 'username'@'%';
GRANT Delete ON database.* TO 'username'@'%';
GRANT Drop ON database.* TO 'username'@'%';
GRANT Index ON database.* TO 'username'@'%';
GRANT Insert ON database.* TO 'username'@'%';
GRANT References ON database.* TO 'username'@'%';
GRANT Select ON database.* TO 'username'@'%';
GRANT Show view ON database.* TO 'username'@'%';
GRANT Update ON database.* TO 'username'@'%';
GRANT PROCESS ON *.* TO 'username'@'%';
```

## 创建管理员用户

```mysql
create user 'zhaoyan'@'%' identified by 'zhaoyan@123';
grant all on *.* to 'zhaoyan'@'%' with grant option;
flush privileges;
```

## 限制只能本地登录root

```mysql
mysql -uroot -p
use mysql;
select * from user where user = 'root';
update user set host = '127.0.0.1' where user = 'root' and host = '%';
flush privileges;
```

## 修改root密码

```mysql
alter user 'root'@'localhost' IDENTIFIED BY '123456';
```

## 允许远程登录

```mysql
grant all privileges  on *.* to root@'%' identified by "123456";
```

## 忘记密码重置

### Windows

1. 首先停止服务
   使用管理员用户打开CMD

   ```cmd
   net stop MYSQL
   ```

   >  MYSQL为MySQL数据库服务名称

2. 将MySQL  数据目录 C:\ProgramData\MySQL\MySQL Server 5.7 下的Data目录复制到 程序目录 C:\Program Files\MySQL\MySQL Server 5.7 下

3. 进入MySQL bin目录

   ```cmd
   cd "C:\Program Files\MySQL\MySQL Server 5.7\bin"
   mysqld --skip-grant-tables
   ```

   > --skip-grant-tables 的意思是启动 MySQL 服务的时候跳过权限表认证

4. 重新打开一个cmd窗口，输入 mysql 回车
   ```cmd
   cd "C:\Program Files\MySQL\MySQL Server 5.7\bin"
   mysql
   ```

5. 连接权限数据库：use mysql

6. 修改数据库连接密码
   ```cmd
   update user set authentication_string =password('123456') where user='root';
   flush privileges;
   exit;
   ```

7. 修改root 密码后，需要执行下面的语句和新修改的密码。不然开启 mysql 时会出错
   ```cmd
   mysqladmin -u root -p shutdown
   ```

8. 将程序目录 C:\Program Files\MySQL\MySQL Server 5.7 下的Data文件夹下复制到数据目录 C:\ProgramData\MySQL\MySQL Server 5.7 下

9. 重启 mysql

   ```cmd
   net start mysql
   ```

# 存储过程和函数

## 函数

创建函数要加上**DELIMITER $$**、**$$ DELIMITER**

MySQL 8 还需要执行

```mysql
-- 查看该参数，默认为0
select @@log_bin_trust_function_creators;
-- 设置为1
set GLOBAL log_bin_trust_function_creators=1;
```

# 信息数据库（information_schema）

## 查看某数据库中所有表的行数

```mysql
select table_name,table_rows from information_schema.tables 
where TABLE_SCHEMA = 'qyqdb' 
order by table_rows desc; 
```

# 主从搭建

## 主节点配置

1. 修改/etc/my.cnf文件，并重启服务
   ```conf
   [mysqld]
   server-id=10     #服务器id (主从必须不一样)
   log-bin=/var/lib/mysql/master10-bin   #打开日志(主机需要打开)
    
   binlog-ignore-db=mysql    #不给从机同步的库(多个写多行)
   binlog-ignore-db=information_schema
   binlog-ignore-db=performance_schema
   binlog-ignore-db=sys
   ```

   注意：log-bin等存储路径的配置，其父路径的属主和组必须是是mysql，且一般权限设置为777。

   ​       如果更改了mysql的存储目录，建议参考默认配置的目录，将新目录的属主和权限也做相应更改

2. 创建从节点访问用户（mysql上执行）
   ```mysql
   CREATE USER 'slave'@'10.181.110.11' IDENTIFIED BY 'slave.8888';
   GRANT REPLICATION SLAVE ON *.* TO 'slave'@'10.181.110.11';
   select user,host from mysql.user;
   ```

3. 查看主节点状态（mysql上执行）

   ```mysql
   systemctl restart mysql    #重启服务
   show master status
   ```

## 从节点配置

1. 修改/etc/my.cnf文件，并重启服务
   ```conf
   server-id=11
   relay-log=relay-bin
   read-only=1
   replicate-ignore-db=mysql               # 不复制的库
   replicate-ignore-db=information_schema  
   replicate-ignore-db=performance_schema
   replicate-ignore-db=sys
   ```

2. 从库关联主库（mysql上执行）

   ```mysql
   CHANGE MASTER TO MASTER_HOST='10.0.2.3',
   MASTER_USER='slave',
   MASTER_PASSWORD='slave.123456',
   MASTER_LOG_FILE='master10-bin.000001',
   MASTER_LOG_POS=154;
   ```

3. 检查状态（mysql上执行）

   ```mysql
   start slave;
   show slave status\G
   ```

   注意：# master_log_file 和 master_log_pos值为主库上面执行show master status得到

   如果 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes，说明配置成功

   \# 如果又更改了其他配置，重启服务后导致上面两个参数出现NO，可以重新执行步骤 2

## 同步故障

### Slave_SQL_Running:No

**原因是主机和从机里的数据不一致**

### Slave_IO_Running:Connecting

**是因为从机使用你配置的主机信息没有登陆到主机里面！修改(从机里面)**

```mysql
stop slave;
change master to master_host="192.168.106.133",master_port=3307,master_user="rep",master_password="123456",master_log_file="master.000001",master_log_pos=745;
start slave;
```

### Slave_IO_Running:No

就是server-id 没有配置成功的原因，需要重新修改配置文件，复制配置文件到容器里面，然后重启就ok

# 二进制日志文件(binlog)

## 查看是否开启

```mysql
SHOW VARIABLES LIKE 'log_bin';
```

## 配置

```mysql
[mysqld]
# 开启binlog
log_bin=ON
# binlog日志的基本文件名
#log_bin_basename=/var/lib/mysql/mysql-bin
# binlog文件的索引文件, 管理所有binlog文件
#log_bin_index=/var/lib/mysql/mysql-bin.index
# 配置serverid
server-id=1
# 设置日志三种格式: STATEMENT、ROW、MIXED。
binlog_format=mixed
# 设置binlog清理时间
expire_logs_days=15
# binlog每个日志文件大小
max_binlog_size=100m
# binlog缓存大小
binlog_cache_size=4m
# 最大binlog缓存大小
max_binlog_cache_size=512m
```



# MyCat 2

## 安装

首先去**Gitee**代码仓库**clone**源码

```shell
git clone https://gitee.com/MycatOne/Mycat2.git
```

打开项目，注意jdk版本需要用**oracle jdk1.8**，否则没有**javafx**包

Maven下载依赖

修改父级`pom.xml`文件中的`<repository>`标签,http后加s

```xml
<repository>
      <id>mvnrepository</id>
      <name>mvnrepository</name>
      <url>https://www.mvnrepository.com/</url>
</repository>
```

执行`maven clean install -DskipTests`

编译后的包位于根目录下的`mycat2\target\mycat2-1.22-release-jar-with-dependencies.jar`

修改根目录下的`start.bat`批处理文件

```bat
"C:\Program Files\Java\jre1.8.0_202\bin\java" -Dfile.encoding=UTF-8 -DMYCAT_HOME=C:\Users\user\Downloads\Mycat2-v1.22-2020-6-25\mycat2\src\main\resources  -jar C:\Users\user\Downloads\Mycat2-v1.22-2020-6-25\mycat2\target\mycat2-1.22-release-jar-with-dependencies.jar

@REM java -Dfile.encoding=UTF-8 -DMYCAT_HOME=D:\newgit\f\mycat2\src\main\resources -jar 
@REM D:\newgit\f\mycat2\target\mycat2-0.5-SNAPSHOP-20200110152640-single.jar
```

根据项目目录进行修改

## 配置

配置目录为根目录下的`mycat2\src\main\resources`

### datasources

```json
{
  "dbType": "mysql",
  "idleTimeout": 60000,
  "initSqls": [],
  "initSqlsGetConnection": true,
  "instanceType": "READ_WRITE",
  "maxCon": 1000,
  "maxConnectTimeout": 30000,
  "maxRetryCount": 5,
  "minCon": 1,
  "name": "prototypeDs",
  "password": "123456",
  "type": "JDBC",
  "url": "jdbc:mysql://localhost3306?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
  "user": "root",
  "weight": 0
}
```

## 启动

运行根目录下的`start.bat`

## 命令

### 查看连接源

```mysql
/*+ mycat:showDataSources{} */
```

### 添加数据源

```mysql
/*+ mycat:createDataSource{
	"dbType":"mysql",
	"idleTimeout":60000,
	"initSqls":[],
	"initSqlsGetConnection":true,
	"instanceType":"READ_WRITE",
	"maxCon":1000,
	"maxConnectTimeout":3000,
	"maxRetryCount":5,
	"minCon":1,
	"name":"ds0",
	"password":"123456",
	"type":"JDBC",
	"url":"jdbc:mysql://192.168.6.158:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
	"user":"root",
	"weight":0
} */;
```

### 查看集群

```mysql
/*+ mycat:showClusters{} */
```

### 添加集群

```mysql
/*+ mycat:createCluster{
	"clusterType":"MASTER_SLAVE",
	"heartbeat":{
		"heartbeatTimeout":1000,
		"maxRetry":3,
		"minSwitchTimeInterval":300,
		"slaveThreshold":0
	},
	"masters":[
		"ds0" //主节点
	],
	"maxCon":2000,
	"name":"c0",
	"readBalanceType":"BALANCE_ALL",
	"switchType":"SWITCH"
} */;
```

### 创建库

```mysql
/*+ mycat:createSchema{
	"customTables":{},
	"globalTables":{},
	"normalTables":{},
	"schemaName":"xxf_sharding",
	"shardingTables":{}
} */;
```

### 创建表

```mysql
/*+ mycat:createTable{
  "schemaName":"xxf_sharding",
	"tableName":"xxf_user",
  "shardingTable":{
		"createTableSQL":"CREATE TABLE `xxf_user` (
			`id` BIGINT(20) NOT NULL COMMENT '用户ID',
			`user_name` VARCHAR(30) NULL DEFAULT NULL COMMENT '用户姓名',
			`email` VARCHAR(50) NULL DEFAULT NULL COMMENT '用户邮箱',
			`phone` VARCHAR(11) NULL DEFAULT NULL COMMENT '手机号码',
			`sex` CHAR(1) NULL DEFAULT NULL COMMENT '用户性别',
			PRIMARY KEY (`id`) USING BTREE
		) COMMENT='笑小枫-用户信息表' COLLATE='utf8_general_ci' ENGINE=InnoDB;",
  
		"function":{
				"properties":{
					"mappingFormat": "c${targetIndex}/xxf_sharding/xxf_user_${tableIndex}",
					"dbNum":2, //分库数量
					"tableNum":3, //分表数量
					"tableMethod":"mod_hash(id)", //分表分片函数
					"storeNum":2, //实际存储节点数量
					"dbMethod":"mod_hash(id)" //分库分片函数
					}
		 },
		 "partition":{
		}
	}
} */;
```

## 分库分表

### 原理

一个数据库由很多表的构成，每个表对应着不同的业务，垂直切分是指按照业务将表进行分布到不同的数据库上面，这样也就将数据或者说压力分担到不同的库上面

### 垂直切分：分库

系统被拆分为用户、订单、支付多个模块，部署在不同机器上。
分库的原则：由于跨库不能关联查询，所以有紧密关联的表应当放在一个数据库中，相互没有关联的表可以分不到不同的数据库。

### 水平切分：分表



### 常用的分片规则

1. 分片算法简介
   Mycat2支持常用的（自动）HASH型分片算法也兼容1.6的内置的(cobar)分片算法。
   HASH型分片算法默认要求集群名字以c为前缀，数字为后缀，`c0就是分片表第一个节点，c1就是第二个节点`，该命名规则允许用户手动改变。

2. mycat2与1.X版本区别
   mycat2的hash型分片算法多基于MOD_HASH，对应Java的%取余运算。
   mycat2的hash型分片算法对于值的处理，总是把分片值转换到列属性的数据类型再做计算。
   mycat2的hash型分片算法适用于等价条件查询。

3. 分片规则与适用性

4. | 分片算法    | 描述           | 分库 | 分表 | 数值类型                               |
   | ----------- | -------------- | ---- | ---- | -------------------------------------- |
   | MOD_HASH    | 取模哈希       | 是   | 是   | 数值，字符串                           |
   | UNI_HASH    | 取模哈希       | 是   | 是   | 数值，字符串                           |
   | RIGHT_SHIFT | 右移哈希       | 是   | 是   | 数值                                   |
   | RANGE_HASH  | 两字段其一取模 | 是   | 是   | 数值，字符串                           |
   | YYYYMM      | 按年月哈希     | 是   | 是   | DATE，DATETIME                         |
   | YYYYDD      | 按年月哈希     | 是   | 是   | DATE，DATETIME                         |
   | YYYYWEEK    | 按年周哈希     | 是   | 是   | DATE，DATETIME                         |
   | HASH        | 取模哈希       | 是   | 是   | 数值，字符串，如果不是，则转换成字符串 |
   | MM          | 按月哈希       | 否   | 是   | DATE，DATETIME                         |
   | DD          | 按日期哈希     | 否   | 是   | DATE，DATETIME                         |
   | MMDD        | 按月日哈希     | 是   | 是   | DATE，DATETIME                         |
   | WEEK        | 按周哈希       | 否   | 是   | DATE，DATETIME                         |
   | STR_HASH    | 字符串哈希     | 是   | 是   | 字符串                                 |

#### 常用分片规则简介

##### MOD_HASH

[数据分片]hash形式的分片算法。如果分片键是字符串，会将字符串hash转换为数值类型。

1. 分库键和分表键相同：
- 分表下标：分片值%(分库数量*分表数量)
- 分库下标：分表下表/分库数量
2. 分库键和分表键相同：
- 分表下标：分片值%分表数量
- 分库下标：分片值%分库数量

##### RIGHT_SHIFT

[数据分片]hash形式的分片算法。仅支持数值类型。
分片值右移两位，按分片数量取余。

##### YYYYMM

[数值分片]hash形式的分片算法。仅用于分库。
(YYYY*12+MM)%分库数量，MM为1–12。

##### MMDD

仅用于分表。仅DATE、DATETIME类型。
一年之中第几天%分表数。tbpartitions不能超过366。

# MySQL 查询语句

## 查询语句中字段别名取表中的comment

在 MySQL 中，字段的 comment 并不存储在数据行里，而是放在 **information_schema.COLUMNS** 中。
因此可以通过把 **column_comment** 查出来，再拼成 **SELECT 语句的别名**，实现“用表中字段的 comment 做别名”的效果。

一次性查出某张表所有列，并把 comment 作为别名：

```mysql
-- 示例：表名 mydb.mytable
SELECT CONCAT(
         'SELECT ',
         GROUP_CONCAT(
           CONCAT('`', COLUMN_NAME, '` AS `', REPLACE(COLUMN_COMMENT, '`', ''), '`')
           ORDER BY ORDINAL_POSITION
         ),
         ' FROM mytable;'
       ) AS sql_text
FROM   information_schema.COLUMNS
WHERE  TABLE_SCHEMA = 'mydb'
  AND  TABLE_NAME   = 'mytable';
```

执行后得到一条 SQL，例如：

```mysql
SELECT id AS 主键, name AS 用户名, age AS 年龄 FROM mytable;
```

**拼 SQL 时丢列**
上一段拼接脚本里 `GROUP_CONCAT` 有 **长度限制**（默认 1024 字节）。
如果表列很多，会被截断导致看起来“少字段”。
解决方法：

```mysql
SET SESSION group_concat_max_len = 1000000;  -- 临时放大
```

