第六周作业

1. 简述DDL,DML,DCL,DQL,并且说明mysql各个关键字查询时候的先后顺序

DDL 数据定义语言:create,drop,alter

DML 数据操纵语言:insert,update,delete

DCL 数据控制语言:grant,revoke

DQL 数据查询语言:select

select 查询先后顺序:from -->where -->group by -->having --select -->order by --limit

2. 自行设计10个sql查询语句,需要用到关键字[GROUP BY/HAVING/ORDER BY/LIMIT],至少同时用到两个。

#以ClassId 为分组依据,显示三组的平均年龄
select ClassId,avg(age) from students group by ClassId limit 3;
#以年龄排序后,显示年龄最大的前10位同学的信息
select * from students order by age desc limit 10;
#
以classid为分组,显示其平均年龄大于25的班级
select c.class,s.ages from classes c left join  (select classid,avg(age) as ages from students  group by classid) as s on s.classid=c.classid where s.ages>25;
#取每位同学课程的平均成绩,显示成绩前三名的同学的姓名和平均成绩
select s.stuid,t.name,avg(s.score) from scores s left join students t on s.stuid=t.stuid group by s.stuid order by avg(s.score) desc limit 3;
#显示前5位同学的姓名、课程及成绩
select s.name,r.course,c.score from scores c left join courses r on c.courseid=r.courseid left join students s on c.stuid=s.stuid order by s.name limit 9;
#以classid分组,按人数由高到低显示每班的同学人数
select class,numofstu from classes group by classid order by numofstu desc;
#以gender分组,显示其年龄之和
select gender,sum(age) from students  where age >25 group by gender;
#以年龄排序后,显示年龄最大的前10位同学的信息
select * from students order by age desc limit 10;
#查询年龄大于大于20,小于等于25岁的同学信息
select * from students where age>=20 and age<=25 order by age desc;
#显示其成员数最少为3个的班级的同学中年龄大于同班同学平均年龄的同学
select s.*,m.ages from students s left join (select classid,avg(age) as ages,count(classid) as num from students  group by classid) as m on m.classid=s.classid where s.age>m.ages and m.num>3 order by s.classid;

3. xtrabackup备份和还原数据库练习

  1. 下载xtrabackup安装包  https://www.percona.com/downloads
  2. 安装xtrabackup
yum install percona-xtrabackup-80-8.0.34-29.1.el8.x86_64.rpm -y
rpm -ql percona-xtrabackup-80

  3. xtrabackup 备份

innobackupex [option] back-root-dir

  选项说明:

--uer: #该选项表示备份账号
--password:#该选项表示备份的密码
--host:#该选项表示备份数据库的地址
--database:#选项接受的参数为数据库名,如果要指定多个数据库,需要以空格隔开;如:“xtra_test  dba_test”
--defaults-file:#该选项指定从哪个文件读取mysql配置,必须放在命令行第一个选项位置
--incremental:#该选项表示创建一个增量备份,需要指定--incremental-basedir
--incremental-basedir:#该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用
--incremental-dir:#表示还原时增量备份的目录
--include=name:#指定表名,格式:databasename.tablename

  4.还原:

innobackupex --copy-back [选项] BACK-DIR
innobackupex --move-back [选项] [--defaults-group=group-name] BACK-DIR
--copy-back:#做数据恢复时将备份数据文件拷贝到mysql服务器的datadir
--move-back:#这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项会移除backup文件,用时必须小心

  还原注意事项:

  1. datadir 目录必须为空,除非指定innobackupex --force-non-empty-directorires选项指定,否则--copy-back选项不会覆盖
  2. 在restore之前,必须shutdown mysql实例,不能将一个运行中的实例restore到datadir目录中
  3. 由于文件属性会被保留,大部分情况下需要在启动实例之前将文件的属主改为mysql,这些文件将属于创建备份的用户,执行chown -R  mysql:mysql  /data/mysql,以上需要在用户调用innobackupex 之前完成

  利用xtrabackup8.0 完全备份还原mysql8.0

#安装xtrabackup包
yum install -y percona-xtrabackup-80-8.0.34-29.1.el8.x86_64.rpm
#在原主机全量备份数据库到backup
mkdir backup
xtrabackup -uroot --backup --target-dir=/root/backup/base
#将backup复制到目标主机
scp -r backup 192.168.180.129:/root
#在目标主机还原
#预准备
xtrabackup --prepare --target-dir=/root/backup/base
#复制到数据目录,数据目录必须为空,否则mysql不能启动 xtrabackup
--copy-back --target-dir=/root/backup/base chown -R mysql:mysql /var/lib/mysql systemctl start mysqld systemctl status mysqld

4. 实现mysql主从复制,主主复制和半同步复制

  主从复制

  主节点配置:

vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=128
log-bin

  从节点配置:

vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=129
read_only
relay_log=relay_log
relay_log_index=relay-log.index

  创建有复制权限的用户和账号

mysql>create user repluser@'192.168.%.%' identified by '123456';
mysql>grant replication slave on *.* to repluser@'192.168.%.%';
#从节点执行
CHANGE MASTER TO MASTER_HOST='192.168.180.128', MASTER_USER='repluser', MASTER_PASSWORD='123456', MASTER_LOG_FILE='rocky8-bin.000001', MASTER_LOG_POS=156; start slave; show slave status;

   主主复制 

  两台master节点配置

vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=128 log-bin auto_increment_offset=1 auto_increment_increment=2

mysql>grant replication slave on *.* to repluser@'192.168.%.%';

mysql> CHANGE MASTER TO MASTER_HOST='192.168.180.129',
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='123456',
-> MASTER_LOG_FILE='rocky8-bin.000001',
-> MASTER_LOG_POS=156;

start slave;

vim /etc/my.cnf.d/mysql-server.cnf
[mysqld] server
-id=128 log-bin auto_increment_offset=2 auto_increment_increment=2

mysql> CHANGE MASTER TO MASTER_HOST='192.168.180.128',
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='123456',
-> MASTER_LOG_FILE='rocky8-bin.000002',
-> MASTER_LOG_POS=156;

start slave;

 在两台主机上分别创建数据库db1,db2

   半同步复制

  master配置

vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=128 log-bin rpl_semi_sync_master_enabled=on rpl_semi_sync_master_timeout=3000
#安装插件,不然mysql启动不了
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';

  slave 配置

vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=129
rpl_semi_sync_slave_enabled=on
#安装插件
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

 当从节点停止复制线程,在master创建数据库,等待3S才能成功

5. 用mycat实现mysql的读写分离

创建mysql主从数据库

    主节点配置:

vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=128
log-bin

    从节点配置:

vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=129
read_only
relay_log=relay_log
relay_log_index=relay-log.index

    创建有复制权限的用户和账号

mysql>create user repluser@'192.168.%.%' identified by '123456';
mysql>grant replication slave on *.* to repluser@'192.168.%.%';
#从节点执行
CHANGE MASTER TO MASTER_HOST='192.168.180.128', MASTER_USER='repluser', MASTER_PASSWORD='123456', MASTER_LOG_FILE='rocky8-bin.000001', MASTER_LOG_POS=156; start slave; show slave status;

  安装mycat并启动

#安装Java环境
yum
install java -y
java -version
#下载安装mycat
mkdir /opt/apps
tar -xvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /opt/apps
#配置环境变量
echo 'PATH=/opt/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
source /etc/profile.d/mycat.sh
#启动mycat
mycat start
tail -300f /opt/apps/mycat/logs/wrapper.log #查看日志成功,代表安装成功
#修改mycat 的server.xml文件配置的mycat连接信息
<property name="serverPort">3306</property> 
<property name="managerPort">9066</property> 
<property name="idleTimeout">300000</property> 
<property name="bindIp">0.0.0.0</property>
<property name="dataNodeIdleCheckPeriod">300000</property> 
<property name="frontWriteQueueSize">4096</property> 
<property name="processors">32</property> 
<property name="authTimeout">150000</property>
<property name="handleDistributedTransactions">0</property>

<user name="root" defaultAccount="true">  #连接mycat的用户名
    <property name="password">123456</property>  #连接mycat的密码
    <property name="schemas">TESTDB</property> #数据库名要和schema.xml对应
    <property name="defaultSchema">TESTDB</property>    
#修改schema.xml实现读写分离
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
    </schema>
    <dataNode name="dn1" dataHost="localhost1" database="hellodb" />
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="host1" url="192.168.180.128:3306" user="liu" password="123456">
        <readHost host="host2" url="192.168.180.129:3306" user="liu" password="123456"/>
        </writeHost>
    </dataHost>
</mycat:schema>

#上面配置中,balance改为1,表示读写分离。一定要保证liu/123456可以成功登录主从数据库。

  #在主服务器创建用户liu并对mycat授权

  create user 'liu'@'192.168.180.%' identified by '123456';

  grant all on *.* to 'liu'@'192.168.180.%';

  flusg privilage;

  #测试验证

  mysql -uroot -p'123456' -h127.0.0.1 TESTDB

  insert into teachers (name,age,gender) values('ning meng',30,'M');

  mycat

   主库

   从库

 

6. 实现openvpn部署,并且测试通过,输出博客或者自己的文档存档。

  

1 openvpn server: 
centos 8.8
eth0:192.168.0.64/24
eth1:192.168.64.128/24
2  内网两台主机
#第一台主机
eth1:192.168.64.129/24  仅主机模式
#第二台主机
eth1:192.168.64.130/24  仅主机模式
3 Windows 客户端
Windows 10

  安装openvpn

yum install openvpn  -y
yum install easy-rsa -y

  生成证书

cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf  /etc/openvpn/
cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-server
cp  /usr/share/doc/easy-rsa/vars.example  /etc/openvpn/easy-rsa-server/3/vars
#修改证书有效期
vim /etc/openvpn/easy-rsa-server/3/vars
#CA证书
set_var EASYRSA_CA_EXPIRE    36500
# 服务器证书
set_var EASYRSA_CERT_EXPIRE    3650
#初始化PKI
cd /etc/openvpn/easy-rsa-server/3
./easyrsa init-pki
#创建ca证书
./easyrsa build-ca nopass
openssl x509 -in pki/ca.crt -noout -text
#生成服务端私钥文件和请求文件
./easyrsa gen-req server nopass
#颁发服务端证书
./easyrsa sign server server
#创建diffie-hellman 密钥
./easyrsa gen-dh
#生成客户端证书
./easyrsa gen-req liu nopass
./easyrsa import-req /etc/openvpn/easy-rsa-server/3/pki/reqs/liu.req  liu
./easyrsa sign client liu
#整理服务端证书
mkdir /etc/openvpn/certs
cp pki/ca.crt /etc/openvpn/certs/
cp pki/issued/server.crt /etc/openvpn/certs/
cp pki/private/server.key /etc/openvpn/certs/
cp pki/dh.pem /etc/openvpn/certs/
#整理客户端证书
mkdir /etc/openvpn/client/liu
find /etc/openvpn/ \( -name "liu.key" -o -name "liu.crt" -o -name ca.crt \) -exec cp {} /etc/openvpn/client/liu \;
#openvpn 服务端配置文件
grep '^[[:alpha:]].*' /etc/openvpn/ server.conf 
port 1194
proto tcp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key  
dh /etc/openvpn/certs/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.64.0 255.255.255.0"
keepalive 10 120
cipher AES-256-CBC
push "compress lz4-v2"
user openvpn
group openvpn
status /var/log/openvpn/openvpn-status.log
log-append  /var/log/openvpn/openvpn.log
verb 3
mute 20

#准备日志目录
gentent passwd openvpn
mkdir /var/log/openvpn
chown openvpn.openvpn /var/log/openvpn
#开启转发
echo  net.ipv4.ip_forward=1 >>/etc/sysctl.conf 
sysctl -p
#启动vpn
vim /usr/lib/systemd/system/openvpn@.service 
[Unit]
Description=OpenVPN Robust And Highly Flexible Tunneling Application on  %I
After=network.target

[Service]
Type=notify
PrivateTmp=true
ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/ --config %i.conf

[Install]
WantedBy=multi-user.target


systemctl daemon-reload
#注意service名称和文件名不一致
systemctl restart openvpn@server

   #准备客户端文件 

vim client.ovpn 
client
dev tun
proto tcp
remote 192.168.0.64 1194
resolv-retry infinite
nobind
#persist-key
#persist-tun
ca ca.crt
cert liu.crt
key liu.key
remote-cert-tls server
#tls-auth ta.key 1
cipher AES-256-CBC
verb 3
compress lz4-v2

  客户端目录:C:\Users\Administrator\OpenVPN\config\client

 

   openvpn启用安全增强功能 

#启用防止DOS攻击的安全增强配置
openvpn --genkey --secret /etc/openvpn/certs/ta.key
#修改server.conf
tls-auth /etc/openvpn/certs/ta.key 0  #客户端为1,服务端为0
#修改client.ovpn
tls-auth  ta.key 1

7. mysql如何实现崩溃后恢复?

  根据mysql历史备份数据,将数据库还原到最近一次全量备份的时间点,获取全量备份时的二进制日志binlog和pos点,再把对应的时间点之后所有的binlog,将所有数据库操作导出成sql,在全量备份还原库后,将导出的SQL导入到库里
8. myisam和innodb各自在什么场景使用?

myisam适用于只读、表较小的场景,其支持全文索引、压缩、空间函数等特性,是表级锁,不支持事务处理、外键约束、MVCC(多版本并发控制机制)

innodb适用于高并发、高可靠性的应用场景,其支持行级锁、事务处理、外键约束等特性,能够保证数据的一致性和完整性,同时支持MVCC高并发

vim /etc/my.cnf.d/mysql-server.cnf
posted @ 2023-11-15 13:32  探索提升  阅读(26)  评论(0)    收藏  举报