目录
一、简述DDL,DML,DCL,DQL,并且说明mysql各个关键字查询时候的先后顺序
二、自行设计10个sql查询语句,需要用到关键字[GROUP BY/HAVING/ORDER BY/LIMIT],至少同时用到两个
三、xtrabackup备份和还原数据库练习
四、实现mysql主从复制
五、 用mycat实现mysql的读写分离
六、实现openvpn部署,并且测试通过,输出博客或者自己的文档存档
一、简述DDL,DML,DCL,DQL,并且说明mysql各个关键字查询时候的先后顺序
DDL(data defination language):数据库定义语言
概念:数据库定义语言主要是建表、删表、修改表字段等操作
关键字:create, drop,alter 等
操作数据库:CRUD
C(Create):创建
- 创建数据库:
- 创建数据库,判断不存在,再创建:
- create database if not exists 数据库名称;
- 创建数据库,并指定字符集
- create database 数据库名称 character set 字符集名;
对数据库进行操作:
1.创建表
-- 通过 create table 表名(字段名 字段类型 ...)可以创建表
-- comment 注释 可以对字段加注释也可以对表加注释
CREATE TABLE emp(
id INT COMMENT '编号',
workno VARCHAR(10) COMMENT '工号',
NAME VARCHAR(10) COMMENT '姓名',
gender CHAR(1) COMMENT '性别',
age TINYINT UNSIGNED COMMENT '年龄',
idcard CHAR(18) COMMENT '身份证号',
workaddress VARCHAR(50) COMMENT '工作地址',
entrydate DATE COMMENT '入职时间'
)COMMENT '员工表'
2.修改表
-- 通过 alter table 表名 add 字段名 字段类型 可以为表添加新字段
ALTER TABLE emp ADD nickname VARCHAR(20) COMMENT '昵称'
-- 通过 alter table 表名 modify 字段名 字段类型(长度)
-- 可以修改已创建的表指定字段类型
ALTER TABLE emp MODIFY age INT (10)
-- 通过 alter table emp change 旧字段名 新字段名 字段类型(长度)
-- 可以修改已创建表的字段名和字段类型
ALTER TABLE emp CHANGE age ages TINYINT(3)
-- 通过alter table 表名 drop 字段名 可以删除表中已有字段
ALTER TABLE emp DROP workno
-- 通过 alter table 表名 rename to 新表名 可以更改已存在表的名称
ALTER TABLE emp RENAME TO employee
?3.删除表
--DROP 表名
-- 通过 drop table if exist 表名可以删除已存在的表
DROP TABLE IF EXISTS emp
DML(data manipulation language):数据库操作语言
概念:是一种对数据库中表数据进行操作的语言,它主要包括添加、修改、删除
关键字:insert, delete, update 等
DML:增删改表中数据
添加数据
- 语法:
- insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
- 注意:
- 列名和值要一一对应。
- 如果表名后,不定义列名,则默认给所有列添加值
insert into 表名 values(值1,值2,...值n); - 除了数字类型,其他类型需要使用引号(单双都可以)引起来
删除数据
- 语法:
- delete from 表名 [where 条件]
- 注意:
- 如果不加条件,则删除表中所有记录。
- 如果要删除所有记录
- delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作
- TRUNCATE TABLE 表名; -- 推荐使用,效率更高 先删除表,然后再创建一张一样的表。
修改数据
-
语法:
- update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件];
-
注意: 如果不加任何条件,则会将表中所有记录全部修改。
对表数据进行操作:
1.添加数据
-- 通过 insert into 表名(字段名1,字段名2...)values(值1,值2,...)
--可以对数据库添加一条数据
INSERT INTO emp (id,workno,NAME,gender,age,idcard,workaddress,entrydate) VALUES(1,1,'ll','男',18,123456789987654321,'中国','2022-01-02')
-- 通过 insert into 表名 values(值1,值2,值3...)
-- 可以添加全部字段的值
INSERT INTO emp VALUES(1,11,'ee','女',19,1234569874561237,'西安','2022-03-04')
-- 通过 insert into 表名(字段名1,字段名2...) values(值1,值2,...),(值1,值2,...),(值1,值2,...)...
-- 可以批量添加数据
INSERT INTO emp (id,workno,NAME,gender,age,idcard,workaddress,entrydate)
VALUES(1,1,'qq','男',16,123456789987654321,'中国','2022-02-03'),(1,1,'qq','男',16,123456789987654321,'中国','2022-02-03'),
(1,1,'qq','男',16,123456789987654321,'中国','2022-02-03'),(2,1,'qq','男',16,123456789987654321,'中国','2022-02-03'),
(3,1,'qq','男',16,123456789987654321,'中国','2022-02-03'),(4,1,'qq','男',16,123456789987654321,'中国','2022-02-03'),
2.修改数据
--警告,修改单条数据时记得加上where条件,否则会修改表所有记录
-- 通过 update 表名 set 字段名=值 where 字段名
-- 可以将表中特定的一条数据的某一字段的值修改为目标值
UPDATE emp SET NAME='itheima' WHERE id=2
3.删除数据
--警告,删除单条数据时记得加上where条件,否则会删除表所有记录
-- 通过 delete from 表名 where 条件
-- 可以将表中特定的数据删除
DELETE FROM emp WHERE gender='女'
--警告,删除单条数据时记得加上where条件,否则会删除表所有记录
DCL(data control language):数据库控制语言
概念:普通查询及简单条件查询
关键字:GRANT, REVOKE 等
1.普通查询?
/*
select 字段列表 from 表名 where 条件列表
group by 分组字段 having 分组条件
order by 排序字段 (asc 升序,desc降序)
limit 分页参数
*/
SELECT * FROM emp -- 查询emp 表中全部数据
SELECT NAME ,workno,age FROM emp -- 查询emp 中的name 和workno信息
SELECT workaddress AS '工作地址' FROM emp -- 字段名 as '内容' 可以给字段取别名
SELECT DISTINCT workaddress '工作地址' FROM emp -- distinct 不显示重复的字段内容(去重)
/*
between ... and 在该范围内 包含两侧值
in(值1,值2,值3) 多选一,有一个条件满足就显示
like 占位符 分为(_匹配单个字符,%匹配任意字符)
is null 是null
and 和 && 并且表示两个条件都要满足
or 或|| 多个条件任意一个成立
not 或 !非,不是
*/
SELECT * FROM emp WHERE idcard IS NULL -- 查询出emp表中idcard是null的数据信息
SELECT * FROM emp WHERE idcard IS NOT NULL -- 查询出emp表中idcard不是null的数据信息
-- 查询出age大于等于15小于等于20 的三种方法
SELECT * FROM emp WHERE age>=15 && age<=20
SELECT * FROM emp WHERE age>=15 AND age<=20
SELECT * FROM emp WHERE age BETWEEN 15 AND 20
-- 查询出age=18,age=20,age=40 的数据信息 的两种方法
SELECT * FROM emp WHERE age=18 OR age=20 OR age=40
SELECT * FROM emp WHERE age IN(18,20,40)
-- 模糊查询姓名为两个字符的数据信息
SELECT * FROM emp WHERE NAME LIKE '__'
-- 模糊查询 身份证号以x 结尾的数据信息
SELECT * FROM emp WHERE idcard LIKE '%x'
?2.复杂条件查询
在进行分组查询时需要注意: 1.group by … having中having后接的是分组后的条件筛选,where后接的是分组前的条件筛选 2.在SQL语句同时有 group by 、order by、limit时,编写顺序是先分组(group by)再排序(order by )最后分页(limit)
where和having区别: 1.where 不能用聚合函数,而having可以 2.条件筛选时不满足 where 条件不能进行分组 3.两者顺序是先where后having
/*
count 统计数量 min最小值 max最大值 avg 平均值 sum 求和
*/
-- 求在西安工作的人的年龄总和
SELECT SUM(age) FROM emp WHERE workaddress='西安'
-- 按照性别分组,求男女性别的人数分别是多少
SELECT gender,COUNT(*) FROM emp GROUP BY gender
-- 按照性别分组,求男女两种性别的平均年龄是多少
SELECT gender,AVG(age) FROM emp GROUP BY gender
-- 按照工作地址分组,查询在同一工作地址上工作人数大于3人并且工作人员年龄小于45
SELECT workaddress,COUNT(*) FROM emp WHERE age<45 GROUP BY workaddress HAVING COUNT(*)>3
-- 按照年龄进行升序排序
SELECT * FROM emp ORDER BY age ASC
-- 按照入职时间进行降序排序
SELECT * FROM emp ORDER BY entrydate DESC
-- 将emp表中数据进行分页,并显示第二页信息
SELECT * FROM emp LIMIT 1,10
-- 按照年龄升序排序,相同年龄的按照入职时间降序排序
SELECT * FROM emp ORDER BY age ASC ,entrydate DESC
DQL(data query language):数据库查询语言
概念:主要是用来管理数据库用户,控制数据库使用权限的
关键字:select, where 等
1.用户管理
-- 创建用户itcast 可以在本机使用,密码是123456
CREATE USER 'itcast'@'localhost' IDENTIFIED BY '123456'
-- 创建用户 任意主机都可以访问
CREATE USER 'itheima'@'%' IDENTIFIED BY '123456'
-- 修改密码
ALTER USER 'itheima'@'%' IDENTIFIED WITH mysql_native_password BY '1234'
-- 删除用户
DROP USER 'itheima'@'%'
?2.数据库授权控制
/*
all,allprivleges 所有权限 select 查询数据 insert 插入数据
update 修改数据 delete 删除数据 alter修改表权限 drop 删除数据库/表/视图 create 创建数据库/表
*/
-- 查询某一个用户的权限
SHOW GRANTS FOR '用户名'@ '主机名'
-- 给某一个用户添加权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名'
-- 撤销某一个用户的权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名'
二、自行设计10个sql查询语句,需要用到关键字[GROUP BY/HAVING/ORDER BY/LIMIT],至少同时用到两个
?完成sql语句查询前,我们提前创建好了两张表,员工表(employee )和部门表(dept)
查询员工表(employee) 表
select * from employee;
mysql> select * from employee;
+------+--------+----------+---------+----------+----------+------------+
| e_no | e_name | e_gender | dept_no | e_job | e_salary | hiredate |
+------+--------+----------+---------+----------+----------+------------+
| 1001 | SMITH | m | 20 | CLERK | 800 | 2005-11-12 |
| 1002 | ALLEN | f | 30 | SALESMAN | 1600 | 2003-05-12 |
| 1003 | WARD | f | 30 | SALESMAN | 1250 | 2003-05-12 |
| 1004 | JONES | m | 20 | MANAGER | 2975 | 1998-05-18 |
| 1005 | MARTIN | m | 30 | SALESMAN | 1250 | 2001-06-12 |
| 1006 | BLAKE | f | 30 | MANAGER | 2850 | 1997-02-15 |
| 1007 | CLARK | m | 10 | MANAGER | 2450 | 2002-09-12 |
| 1008 | scorr | m | 20 | ANALYST | 3000 | 2003-05-12 |
| 1009 | KING | E | 10 | PRES | 5000 | 1995-01-01 |
| 1010 | TURNER | f | 30 | SALESMAN | 1500 | 1997-10-12 |
| 1011 | ADAMS | m | 20 | CLERK | 1100 | 1999-10-05 |
| 1012 | JAMES | m | 30 | CLERK | 950 | 2008-06-15 |
| 1013 | Mofan | M | 30 | CLERK | 1000 | 2022-06-10 |
+------+--------+----------+---------+----------+----------+------------+
查询部门表(dept)
select * from dept;
mysql> select * from dept;
+------+------------+------------+
| d_no | d_name | d_location |
+------+------------+------------+
| 10 | ACCOUNTING | ShangHai |
| 20 | RESEARCH | BeiJing |
| 30 | SALES | ShenZhen |
| 40 | OPERATIONS | FuJian |
+------+------------+------------+
4 rows in set (0.02 sec)
查询条件如下:
多表查询,显示雇员名,雇员工资,部门
查询工资比部门30号的所有员工的工资高的员工的姓名,工资,部门号
如何查询和部门10的工作相同的雇员姓名、工作、工资、部门号,但是不含10号部门自己的雇员
查询每个员工所在部门,显示员工姓名和部门名?
要求查询员工的部门名称
要求查询员工姓名及部门名称
查询工作为'MANAGER'和'SALESMAN' 的信息
按照薪资排序,取出排名在前5名的员工
按照薪资降序,取出排名从第3名员工开始,长度为4的信息
如何显示与SMITH同一部门的所有员工
1.多表查询,显示雇员名,雇员工资,部门?
1.多表查询,显示雇员名,雇员工资,部门
mysql> select e_name,e_salary,d_name from employee,dept
-> where employee.dept_no = dept.d_no;
+--------+----------+------------+
| e_name | e_salary | d_name |
+--------+----------+------------+
| CLARK | 2450 | ACCOUNTING |
| KING | 5000 | ACCOUNTING |
| SMITH | 800 | RESEARCH |
| JONES | 2975 | RESEARCH |
| scorr | 3000 | RESEARCH |
| ADAMS | 1100 | RESEARCH |
| ALLEN | 1600 | SALES |
| WARD | 1250 | SALES |
| MARTIN | 1250 | SALES |
| BLAKE | 2850 | SALES |
| TURNER | 1500 | SALES |
| JAMES | 950 | SALES |
| Mofan | 1000 | SALES |
+--------+----------+------------+
13 rows in set (0.00 sec)
2.查询工资比部门30号的所有员工的工资高的员工的姓名,工资,部门号
1.mysql> select e_name,e_salary,dept_no
-> from employee
-> where e_salary > all(
-> select e_salary
-> from employee
-> where dept_no = 30);
+--------+----------+---------+
| e_name | e_salary | dept_no |
+--------+----------+---------+
| JONES | 2975 | 20 |
| scorr | 3000 | 20 |
| KING | 5000 | 10 |
+--------+----------+---------+
3 rows in set (0.01 sec)
?3.如何查询和部门10的工作相同的雇员姓名、工作、工资、部门号,但是不含10号部门自己的雇员
mysql> select e_name,e_job,e_salary,dept_no
from employee
where e_job in (
select distinct e_job
from employee
where dept_no = 10
) and dept_no != 10;
+--------+---------+----------+---------+
| e_name | e_job | e_salary | dept_no |
+--------+---------+----------+---------+
| JONES | MANAGER | 2975 | 20 |
| BLAKE | MANAGER | 2850 | 30 |
+--------+---------+----------+---------+
2 rows in set (0.01 sec)
?4.查询每个员工所在部门,显示员工姓名和部门名?
mysql> select e_name,e_job,d_name from employee,dept
where employee.dept_no = dept.d_no;
+--------+------------+------------+
| e_name | e_job | d_name |
+--------+------------+------------+
| CLARK | MANAGER | ACCOUNTING |
| KING | PRES工DENT | ACCOUNTING |
| SMITH | CLERK | RESEARCH |
| JONES | MANAGER | RESEARCH |
| scorr | ANALYST | RESEARCH |
| ADAMS | CLERK | RESEARCH |
| ALLEN | SALESMAN | SALES |
| WARD | SALESMAN | SALES |
| MARTIN | SALESMAN | SALES |
| BLAKE | MANAGER | SALES |
| TURNER | SALESMAN | SALES |
| JAMES | CLERK | SALES |
+--------+------------+------------+
12 rows in set (0.01 sec)
?5.要求查询员工的部门名称
mysql> select
e_name as '员工姓名',d_name as '部门名' //起别名
from
employee join dept
on
employee.dept_no = dept.d_no; //员工的部门编号等于部门的编号。
+----------+------------+
| 员工姓名 | 部门名 |
+----------+------------+
| CLARK | ACCOUNTING |
| KING | ACCOUNTING |
| SMITH | RESEARCH |
| JONES | RESEARCH |
| scorr | RESEARCH |
| ADAMS | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| MARTIN | SALES |
| BLAKE | SALES |
| TURNER | SALES |
| JAMES | SALES |
+----------+------------+
12 rows in set (0.00 sec)
?6.要求查询员工姓名及部门名称
mysql> select
e_name as '员工姓名',d_name as '部门名'
from
employee e right outer join dept d //outer可以省略
on
e.dept_no = d.d_no;
+----------+------------+
| 员工姓名 | 部门名 |
+----------+------------+
| CLARK | ACCOUNTING |
| KING | ACCOUNTING |
| SMITH | RESEARCH |
| JONES | RESEARCH |
| scorr | RESEARCH |
| ADAMS | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| MARTIN | SALES |
| BLAKE | SALES |
| TURNER | SALES |
| JAMES | SALES |
| NULL | OPERATIONS |
+----------+------------+
13 rows in set (0.00 sec)
?7.查询工作为'MANAGER'和'SALESMAN' 的信息
mysql> select * from employee
-> where e_job = 'MANAGER' or e_job = 'SALESMAN';
+------+--------+----------+---------+----------+----------+------------+
| e_no | e_name | e_gender | dept_no | e_job | e_salary | hiredate |
+------+--------+----------+---------+----------+----------+------------+
| 1002 | ALLEN | f | 30 | SALESMAN | 1600 | 2003-05-12 |
| 1003 | WARD | f | 30 | SALESMAN | 1250 | 2003-05-12 |
| 1004 | JONES | m | 20 | MANAGER | 2975 | 1998-05-18 |
| 1005 | MARTIN | m | 30 | SALESMAN | 1250 | 2001-06-12 |
| 1006 | BLAKE | f | 30 | MANAGER | 2850 | 1997-02-15 |
| 1007 | CLARK | m | 10 | MANAGER | 2450 | 2002-09-12 |
| 1010 | TURNER | f | 30 | SALESMAN | 1500 | 1997-10-12 |
+------+--------+----------+---------+----------+----------+------------+
7 rows in set (0.01 sec)
?8.按照薪资排序,取出排名在前5名的员工
mysql> select e_name,e_salary from employee
-> group by e_salary
-> limit 5; //取前5
+--------+----------+
| e_name | e_salary |
+--------+----------+
| SMITH | 800 |
| ALLEN | 1600 |
| WARD | 1250 |
| JONES | 2975 |
| BLAKE | 2850 |
+--------+----------+
5 rows in set (0.00 sec)
?9.按照薪资降序,取出排名从第3名员工开始,长度为4的信息
mysql> select e_name,e_salary from employee
-> order by e_salary desc
-> limit 3,4;
+--------+----------+
| e_name | e_salary |
+--------+----------+
| BLAKE | 2850 |
| CLARK | 2450 |
| ALLEN | 1600 |
| TURNER | 1500 |
+--------+----------+
4 rows in set (0.00 sec)
?10.如何显示与SMITH同一部门的所有员工
mysql> select e_name,dept_no
-> from employee
-> where dept_no = (
-> select dept_no
-> from employee
-> where e_name = 'SMITH'
-> );
+--------+---------+
| e_name | dept_no |
+--------+---------+
| SMITH | 20 |
| JONES | 20 |
| scorr | 20 |
| ADAMS | 20 |
+--------+---------+
4 rows in set (0.00 sec)
三、xtrabackup备份和还原数据库练习
xtrabackup特点
备份还原过程快速、可靠?
备份过程不会打断正在执行的事务
能够基于压缩等功能节约磁盘空间和流量
自动实现备份校验
开源、免费
xtrabackup2.2版之前包括4个可执行文件
innobackupex:? ? ? ? Perl脚本
xtrabackup:? ? ? ? ? ? C/C++,编写的二进制程序
xbcrypt:? ? ? ? ? ? ? ? ? 加解密
xbstream:? ? ? ? ? ? ? ?支持并发写的流文件格式
xtrabackup备份工具
percona提供的mysql数据库备份工具,唯一开源的能够对innodb和xtradb数据库进行热备的工具
手册:Redirectinghttps://www.percona.com/doc/percona-xtrabackup/LATEST/index.html
下载:Download Percona XtraBackup 8.0Download Percona XtraBackup which is an open source, free MySQL? hot backup software that performs non-blocking backups for InnoDB and XtraDB databases.https://www.percona.com/downloads/XtraBackup/LATEST/
xtrabackup备份过程
?利用xtrabackup安全、增量备份及还原
利用xtrabackup8.0进行完全、增量备份及还有mysql8.0
安装xtrabackup包(备份、还原主机都需要安装都相同版本xtrabackup包)
yum -y install percona-xtrabackup-80-8.0.23-16.1.e18.x86_64.rpm
在原主机做完全备份到/backup
#指定备份目录
mkdir? /backup
#支持用户名、密码验证,指定备份选项及备份到/backup/base目录下,/base不需要事先创建,他会自动创建
xtrabackup -uroot -p123456 --backup --target-dir=/backup/base
目标主机无需创建/backup目录,直接复制目录本身
#例如:scp -r /backup/? ? ?192.168.116.130:/
?scp -r /backup/? ? ?目标主机:/
在目标主机上还原
注意:恢复主机mysql服务停止,并且数据目录为空
预准备:确保数据一致,提交做的事务,回滚未完成的事务
yum -y install percona-xtrabackup-80-8.0.23-16.1.e18.x86_64.rpm
#--perpare,保证数据事务完整状态,数据一致性原则
xtrabackup --perpare --target-dir=/backup/base
复制到数据库目录
注意:数据库目录为空,mysql服务不能启动
xtrabackup --copy-back --target-dir=/backup/base
还原属性
#修改文件属性所有者,组为mysql
chmod -R mysql.mysql /var/lib/mysql
启动服务
service mysqld start
登录数据库核对数据是否备份、还原完成?
四、实现mysql主从复制
一主一从复制架构
主从复制原理图?
?
?主机环境
主节点? ? ?10.0.0.129? ? ?mysql?8.0.26????????hostname-master
从节点? ? ?10.0.0.128? ? ?mysql?8.0.26????????hostname-slave1
环境准备
关闭防火墙
关闭selinux
时间同步
主、从服务器使用相同版本mysql数据库
主从复制特点
异步复制
主从数据不一致比较常见
主从复制实现
主节点配置:
1.启用二进制日志(mysql8.0版本是默认开启的)
[mysqld] log_bin 2.为当前节点设置一个全局惟一的ID号
[17:59:36 root@master ~]#vim /etc/my.cnf
#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
[mysqld]
server-id=129
log-bin=/data/logbin/mysql-bin
3.创建数据备份目录并修改所属权限为mysql
[16:07:16 root@master ~]#mkdir /data/logbin
[16:07:46 root@master ~]#chown mysql.mysql /data/logbin
4.重新启动myslq服务
[16:08:15 root@master ~]#systemctl restart mysqld
5.查看/data/logbin/目录是否有数据生成
[16:09:08 root@master ~]#ls /data/logbin/
6.登录mysql,创建账号
指定账号名、密码及使用的网段
?[16:09:25 root@master ~]#mysql
mysql> create user repluser@'10.0.0.%' identified by '123456'; Query OK, 0 rows affected (0.02 sec)
7.账号授权,所有信息都能进行复制 * . *
mysql> grant replication slave on * . *to repluser@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)
此时主节点配置及账号创建完成
8.开始备份
[16:18:56 root@master ~]#mysqldump -A -F --single-transaction --master-data > /backup/full-`date +%F`.sql
9.从节点设置一个全局惟一的ID号
vim /etc/my.cnf.d
?10.在主节点将备份的数据复制到从节点
[16:40:08 root@master ~]#scp /backup/full-2022-10-24.sql 10.0.0.128:/backup
root@10.0.0.128's password:
full-2022-10-24.sql 100% 1198KB 65.0MB/s 00:00
11.在从节点查看一下,是否拷贝成功 (有数据说明成功)
[16:40:55 root@slave1 ~]#ls /backup/
full-2022-10-24.sql
12.指定哪个账号,密码连接的主节点IP地址,并且从哪个位置的二进制进行同步
[16:41:10 root@slave1 ~]#vim /backup/full-2022-10-24.sql
CHANGE MASTER TO
MASTER_HOST='10.0.0.129',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=156;
?13.开始还原
从节点临时关闭二进制
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
14.数据还原
mysql> source /backup/full-2022-10-24.sql ;
?15.再开启二进制
mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)
16.查看线程同步信息(此时运行状态为NO,说明目前未运行)
mysql> show slave status\G
?17.在从节点开启同步线程
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
18.查看从节点线程状态
mysql> show processlist;
?19.主节点查看线程状态,说明开启成功
mysql> show processlist;
?20.主节点查看(说明建立连接)
[17:07:52 root@master ~]#ss -nt
?21.从节点查看
mysql> show slave status\G
?22.新增mysql数据,对比主从相关记录变化,完成
五、 用mycat实现mysql的读写分离
mycat介绍
Mycat是数据库中间件,所谓中间件,是一类连接软件组件和应用的计算机软件,以便软件各部件之间的通信。
例如 tomcat,web的中间件。而数据库中间件是连接Java应用程序和数据库中间的软件。
mycat特点
前身是阿里的cobar 一个开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品 一个新颖的数据库中间件产品
mycat原理
Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
利用mycat实现mysql的读、写分离
准备环境
#关闭selinux和防火墙
systemctl stop? firewlld
setenforce 0
时间同步服务
?服务器共三台
mycat-server
mysql-master? ? ? ? mysql 8.0版本
mysql-slave? ? ? ? ? ?mysql 8.0版本
1. 创建mysql主从数据库
yum - y install mysql-server
或者
yum -y install mariadb-server
1)修改master和slave上的配置文件
#master上的my.cfg
vim /etc/my.cfg.d/mariadb-server.cnf
[mysqld]
server-id = 1
log-bin
#salve上的my.cnf
[mysqld]
server-id = 2
?配置修改完成之后重启数据库服务
systemctl start mariadb
2)master上创建复制用户
mysql -uroot -p
3)slave上执行
master -uroot -p
2.在mysql代理服务器上安装mycat并启动
[ root@rocky8 ~]#yum -y install java
#确认安装成功
java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
#下载并安装
?wget http://d1.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz
?wget http://d1.mycat.org.cn/1.6.7.6/Mycat-server-1.6.7.6-release-/Mycat-server-1.6.7.4-release-20210303094759-linux.tar.gz -C /apps
mkdir /apps
[root@rocky8 ~]#tar xvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps/
[root@rocky8 ~]#tar xvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps
#配置环境变量
[root@rocky8 ~]#echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
[root@rocky8 ~]#source /etc/profile.d/mycat.sh
启动mycat
[root@rocky8 ~]#file /apps/mycat/bin/mycat
/apps/mycat/bin/mycat: POSIX shell script, ASCII text executable
[root@rocky8 ~]#mycat
Usage: /apps/mycat/bin/mycat { console | start | stop | restart | status | dump }
?注意:此步启动较慢,需要等一会儿,另外如果内存太小,会导致无法启动
[22:12:26 root@rocky8 ~]#mycat start
Starting Mycat-server...
#查看日志,确定成功
tail /apps/mycat/logs/wrapper.log
?4.在mycat服务器上修改server.xml文件配置mycat的连接信息
#修改下面行的8066改为3306复制到独立非注释行
5.修改schema.xml实现读写分离策略
?重新启动mycat
mycat restart
范例:schema.xml
?6.在后端主服务器创建用户并对mycat授权
?7.在mycat服务器上连接并测试
mysql -uroot -p123456 -h 192.168.116.130 TESTDB
8.通过通用日志确认实现读写分离
?9.停止从节点,mycat自动调度读请求至主节点
?10.mycat对后端服务器的健康性检查方法 select user()
?六、实现openvpn部署,并且测试通过,输出博客或者自己的文档存档
openvpn官网:https://openvpn.net/
openvpn客户端安装过程:
?
?
?
|