diff --git a/source/_posts/Linux.md b/source/_posts/Linux.md index a89e265..ba4ba89 100644 --- a/source/_posts/Linux.md +++ b/source/_posts/Linux.md @@ -382,6 +382,14 @@ echo 'Hello, World!' `#!` 和 `/bin/bash` 之间的空格无关紧要。你也可以使用 `#!/bin/bash`。 +## yum + +### 改阿里源 + +```shell +yum install -y wget && mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup && wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && yum clean all && yum makecache +``` + ## 安装MySQL 有些Linux会自带MariaDB数据库,所以需要先卸载 @@ -597,7 +605,7 @@ error: Failed dependencies: libcrypto.so.10(libcrypto.so.10)(64bit) is needed by mysql-community-libs-compat-5.7.41-1.el7.x86_64 libssl.so.10()(64bit) is needed by mysql-community-libs-compat-5.7.41-1.el7.x86_64 libssl.so.10(libssl.so.10)(64bit) is needed by mysql-community-libs-compat-5.7.41-1.el7.x86_64 -dnf install https://repo.almalinux.org/almalinux/8/AppStream/x86_64/os/Packages/compat-openssl10-1.0.2o-4.el8_6.x86_64.rpm +dnf install -y https://repo.almalinux.org/almalinux/8/AppStream/x86_64/os/Packages/compat-openssl10-1.0.2o-4.el8_6.x86_64.rpm rpm -ivh mysql-community-devel-5.7.41-1.el7.x86_64.rpm # 如果出现以下错误 error: Failed dependencies: @@ -617,6 +625,21 @@ rpm -ivh mysql-community-server-5.7.41-1.el7.x86_64.rpm /usr/lib/tmpfiles.d/mysql.conf:23: Line references path below legacy directory /var/run/, updating /var/run/mysqld → /run/mysqld; please update the tmpfiles.d/ drop-in file accordingly. vim /usr/lib/tmpfiles.d/mysql.conf # 将/var/run/mysqld 改为 /run/mysqld +# 如果出现以下提示 +error: Failed dependencies: + libcrypt.so.1()(64bit) is needed by mysql-community-server-5.7.41-1.el7.x86_64 + libcrypt.so.1(GLIBC_2.2.5)(64bit) is needed by mysql-community-server-5.7.41-1.el7.x86_64 +dnf install -y libxcrypt-compat +# 如果出现以下提示 +error: Failed dependencies: + /usr/bin/perl is needed by mysql-community-server-5.7.41-1.el7.x86_64 + perl(Getopt::Long) is needed by mysql-community-server-5.7.41-1.el7.x86_64 + perl(strict) is needed by mysql-community-server-5.7.41-1.el7.x86_64 +dnf install -y perl.x86_64 +# 如果出现以下提示 +error: Failed dependencies: + net-tools is needed by mysql-community-server-5.7.41-1.el7.x86_64 +dnf install net-tools -y # 再次执行 rpm -ivh mysql-community-server-5.7.41-1.el7.x86_64.rpm rpm -ivh mysql-community-embedded-compat-5.7.41-1.el7.x86_64.rpm diff --git a/source/_posts/MySQL.md b/source/_posts/MySQL.md index 1b54ad6..e975aa1 100644 --- a/source/_posts/MySQL.md +++ b/source/_posts/MySQL.md @@ -165,7 +165,7 @@ mysqldump -uroot -p -B test > test.sql 11. 安装数据库 ```powershell - mysqld --install + mysqld --install <服务名> ``` 12. 启动服务 @@ -196,7 +196,7 @@ mysqldump -uroot -p -B test > test.sql mysqld --remove ``` -# Linux 安装MySQL客户端 +# Linux 安装MySQL ## 安装 @@ -258,6 +258,56 @@ mysqldump -uroot -p -B test > test.sql +# 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 客户端 执行脚本 @@ -268,6 +318,8 @@ source <脚本绝对路径> # 用户和权限 +## 用户各项权限 + ```mysql CREATE USER 'username'@'%' IDENTIFIED BY 'password'; GRANT Usage ON *.* TO 'username'@'%'; @@ -303,6 +355,20 @@ 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"; +``` + + + # 存储过程和函数 ## 函数 @@ -318,3 +384,334 @@ select @@log_bin_trust_function_creators; set GLOBAL log_bin_trust_function_creators=1; ``` +# 主从搭建 + +## 主节点配置 + +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 + +# MyCat 2 + +## 安装 + +首先去**Gitee**代码仓库**clone**源码 + +```shell +git clone https://gitee.com/MycatOne/Mycat2.git +``` + +打开项目,注意jdk版本需要用**oracle jdk1.8**,否则没有**javafx**包 + +Maven下载依赖 + +修改父级`pom.xml`文件中的``标签,http后加s + +```xml + + mvnrepository + mvnrepository + https://www.mvnrepository.com/ + +``` + +执行`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。