Linux,第六篇

Linux,第六篇

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

  • DDL: Data Defination Language 数据定义语言
    • CREATE,DROP,ALTER
  • DML: Data Manipulation Language 数据操纵语言
    • INSERT,DELETE,UPDATE
    • 软件开发:CRUD
  • DQL:Data Query Language 数据查询语言
    • SELECT
  • DCL:Data Control Language 数据控制语言
    • GRANT,REVOKE

查询执行路径中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎

SELECT语句的执行流程:

FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause -->SELECT --> ORDER BY --> LIMIT

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

sql语句应用场景为班级学生教师查询类,电子商城筛选价格牌子类,由于道理互通,导入hellodb.sql生成数据库作为例子

  1. 在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄

    MariaDB [hellodb]> select age,name from students where age >25;
    +-----+--------------+
    | age | name         |
    +-----+--------------+
    |  53 | Xie Yanke    |
    |  32 | Ding Dian    |
    |  26 | Yu Yutong    |
    |  46 | Shi Qing     |
    |  33 | Tian Boguang |
    |  27 | Xu Xian      |
    | 100 | Sun Dasheng  |
    +-----+--------------+
    7 rows in set (0.000 sec)
    
  2. 以ClassID为分组依据,显示每组的平均年龄

    MariaDB [hellodb]> select avg(age),classid from students group by classid;
    +----------+---------+
    | avg(age) | classid |
    +----------+---------+
    |  63.5000 |    NULL |
    |  20.5000 |       1 |
    |  36.0000 |       2 |
    |  20.2500 |       3 |
    |  24.7500 |       4 |
    |  46.0000 |       5 |
    |  20.7500 |       6 |
    |  19.6667 |       7 |
    +----------+---------+
    8 rows in set (0.000 sec)
    
  3. 显示第2题中平均年龄大于30的分组及平均年龄

    MariaDB [hellodb]> select avg(age),classid from students  group by classid having avg(age)>30;
    +----------+---------+
    | avg(age) | classid |
    +----------+---------+
    |  63.5000 |    NULL |
    |  36.0000 |       2 |
    |  46.0000 |       5 |
    +----------+---------+
    3 rows in set (0.000 sec)
    
  4. 显示以L开头的名字的同学的信息

    MariaDB [hellodb]> select * from students where  name like 'L%';
    +-------+-------------+-----+--------+---------+-----------+
    | StuID | Name        | Age | Gender | ClassID | TeacherID |
    +-------+-------------+-----+--------+---------+-----------+
    |     8 | Lin Daiyu   |  17 | F      |       7 |      NULL |
    |    14 | Lu Wushuang |  17 | F      |       3 |      NULL |
    |    17 | Lin Chong   |  25 | M      |       4 |      NULL |
    +-------+-------------+-----+--------+---------+-----------+
    
  5. 显示TeacherID非空的同学的相关信息

    MariaDB [hellodb]> select * from students where teacherid is not null;
    +-------+-------------+-----+--------+---------+-----------+
    | StuID | Name        | Age | Gender | ClassID | TeacherID |
    +-------+-------------+-----+--------+---------+-----------+
    |     1 | Shi Zhongyu |  22 | M      |       2 |         3 |
    |     2 | Shi Potian  |  22 | M      |       1 |         7 |
    |     3 | Xie Yanke   |  53 | M      |       2 |        16 |
    |     4 | Ding Dian   |  32 | M      |       4 |         4 |
    |     5 | Yu Yutong   |  26 | M      |       3 |         1 |
    +-------+-------------+-----+--------+---------+-----------+
    5 rows in set (0.000 sec)
    
  6. 以年龄排序后,显示年龄最大的前10位同学的信息

    MariaDB [hellodb]> select * from students order by age desc limit 10;
    +-------+--------------+-----+--------+---------+-----------+
    | StuID | Name         | Age | Gender | ClassID | TeacherID |
    +-------+--------------+-----+--------+---------+-----------+
    |    25 | Sun Dasheng  | 100 | M      |    NULL |      NULL |
    |     3 | Xie Yanke    |  53 | M      |       2 |        16 |
    |     6 | Shi Qing     |  46 | M      |       5 |      NULL |
    |    13 | Tian Boguang |  33 | M      |       2 |      NULL |
    |     4 | Ding Dian    |  32 | M      |       4 |         4 |
    |    24 | Xu Xian      |  27 | M      |    NULL |      NULL |
    |     5 | Yu Yutong    |  26 | M      |       3 |         1 |
    |    17 | Lin Chong    |  25 | M      |       4 |      NULL |
    |    23 | Ma Chao      |  23 | M      |       4 |      NULL |
    |    18 | Hua Rong     |  23 | M      |       7 |      NULL |
    +-------+--------------+-----+--------+---------+-----------+
    10 rows in set (0.000 sec)
    
  7. 查询年龄大于等于20岁,小于等于25岁的同学的信息

    MariaDB [hellodb]> select * from students where age between 20 and 25;
    +-------+---------------+-----+--------+---------+-----------+
    | StuID | Name          | Age | Gender | ClassID | TeacherID |
    +-------+---------------+-----+--------+---------+-----------+
    |     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
    |     2 | Shi Potian    |  22 | M      |       1 |         7 |
    |     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
    |    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
    |    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
    |    17 | Lin Chong     |  25 | M      |       4 |      NULL |
    |    18 | Hua Rong      |  23 | M      |       7 |      NULL |
    |    21 | Huang Yueying |  22 | F      |       6 |      NULL |
    |    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
    |    23 | Ma Chao       |  23 | M      |       4 |      NULL |
    +-------+---------------+-----+--------+---------+-----------+
    10 rows in set (0.000 sec)
    
  8. 以ClassID分组,显示每班的同学的人数

    MariaDB [hellodb]> select count(*),classid from students group by classid;
    +----------+---------+
    | count(*) | classid |
    +----------+---------+
    |        2 |    NULL |
    |        4 |       1 |
    |        3 |       2 |
    |        4 |       3 |
    |        4 |       4 |
    |        1 |       5 |
    |        4 |       6 |
    |        3 |       7 |
    +----------+---------+
    8 rows in set (0.000 sec)
    
  9. 以Gender分组,显示其年龄之和

    MariaDB [hellodb]> select sum(age),gender from students group by gender ;
    +----------+--------+
    | sum(age) | gender |
    +----------+--------+
    |      190 | F      |
    |      495 | M      |
    +----------+--------+
    2 rows in set (0.000 sec)
    
  10. 以ClassID分组,显示其平均年龄大于25的班级

    MariaDB [hellodb]> select c.class,c.classid from classes c left outer join students s on c.classid=s.classid group by s.classid having avg(s.age)>25;
    +----------------+---------+
    | class          | classid |
    +----------------+---------+
    | Emei Pai       |       2 |
    | Riyue Shenjiao |       5 |
    +----------------+---------+
    2 rows in set (0.000 sec)
    
  11. 以Gender分组,显示各组中年龄大于25的学员的年龄之和

    MariaDB [hellodb]> select sum(age),gender from students where  age >25 group by gender ;
    +----------+--------+
    | sum(age) | gender |
    +----------+--------+
    |      317 | M      |
    +----------+--------+
    1 row in set (0.000 sec)
    
  12. 显示前5位同学的姓名、课程及成绩

    MariaDB [hellodb]> select st.stuid,st.name,st.age,soc.courseid,soc.score,co.course from students st  left outer join scores soc on st.stuid=soc.stuid left outer join courses co on soc.courseid=co.courseid where  st.stuid<=5;
    +-------+-------------+-----+----------+-------+----------------+
    | stuid | name        | age | courseid | score | course         |
    +-------+-------------+-----+----------+-------+----------------+
    |     1 | Shi Zhongyu |  22 |        2 |    77 | Kuihua Baodian |
    |     1 | Shi Zhongyu |  22 |        6 |    93 | Weituo Zhang   |
    |     2 | Shi Potian  |  22 |        2 |    47 | Kuihua Baodian |
    |     2 | Shi Potian  |  22 |        5 |    97 | Daiyu Zanghua  |
    |     3 | Xie Yanke   |  53 |        2 |    88 | Kuihua Baodian |
    |     3 | Xie Yanke   |  53 |        6 |    75 | Weituo Zhang   |
    |     4 | Ding Dian   |  32 |        5 |    71 | Daiyu Zanghua  |
    |     4 | Ding Dian   |  32 |        2 |    89 | Kuihua Baodian |
    |     5 | Yu Yutong   |  26 |        1 |    39 | Hamo Gong      |
    |     5 | Yu Yutong   |  26 |        7 |    63 | Dagou Bangfa   |
    +-------+-------------+-----+----------+-------+----------------+
    10 rows in set (0.001 sec)
    
  13. 显示其成绩高于80的同学的名称及课程

    MariaDB [hellodb]> select st.stuid,st.name,st.age,soc.courseid,soc.score,co.course from students st  left outer join scores soc on st.stuid=soc.stuid left outer join courses co on soc.courseid=co.courseid where  soc.score>80;
    +-------+-------------+-----+----------+-------+----------------+
    | stuid | name        | age | courseid | score | course         |
    +-------+-------------+-----+----------+-------+----------------+
    |     1 | Shi Zhongyu |  22 |        6 |    93 | Weituo Zhang   |
    |     2 | Shi Potian  |  22 |        5 |    97 | Daiyu Zanghua  |
    |     3 | Xie Yanke   |  53 |        2 |    88 | Kuihua Baodian |
    |     4 | Ding Dian   |  32 |        2 |    89 | Kuihua Baodian |
    |     6 | Shi Qing    |  46 |        1 |    96 | Hamo Gong      |
    |     7 | Xi Ren      |  19 |        1 |    86 | Hamo Gong      |
    |     7 | Xi Ren      |  19 |        7 |    83 | Dagou Bangfa   |
    |     8 | Lin Daiyu   |  17 |        3 |    93 | Jinshe Jianfa  |
    +-------+-------------+-----+----------+-------+----------------+
    8 rows in set (0.000 sec)
    
  14. 取每位同学各门课的平均成绩,显示成绩前三名的同学的姓名和平均成绩

    MariaDB [hellodb]> select st.stuid,st.name,st.age,soc.courseid,co.course,avg(soc.score) from students st  left outer join scores soc on st.stuid=soc.stuid left outer join courses co on soc.courseid=co.courseid group by soc.stuid having avg(soc.score) order by avg(soc.score) desc limit 3;
    +-------+-------------+-----+----------+----------------+----------------+
    | stuid | name        | age | courseid | course         | avg(soc.score) |
    +-------+-------------+-----+----------+----------------+----------------+
    |     6 | Shi Qing    |  46 |        1 | Hamo Gong      |        96.0000 |
    |     1 | Shi Zhongyu |  22 |        2 | Kuihua Baodian |        85.0000 |
    |     7 | Xi Ren      |  19 |        1 | Hamo Gong      |        84.5000 |
    +-------+-------------+-----+----------+----------------+----------------+
    3 rows in set (0.000 sec)
    
  15. 显示每门课程课程名称及学习了这门课的同学的个数

    MariaDB [hellodb]> select count(st.stuid) 课程学习人数,soc.courseid,co.course 课程名称 from students st  left outer join scores soc on st.stuid=soc.stuid left outer join courses co on soc.courseid=co.courseid where co.course is not null group by course;
    +--------------------+----------+----------------+
    | 课程学习人数       | courseid | 课程名称       |
    +--------------------+----------+----------------+
    |                  2 |        7 | Dagou Bangfa   |
    |                  2 |        5 | Daiyu Zanghua  |
    |                  3 |        1 | Hamo Gong      |
    |                  1 |        3 | Jinshe Jianfa  |
    |                  4 |        2 | Kuihua Baodian |
    |                  1 |        4 | Taiji Quan     |
    |                  2 |        6 | Weituo Zhang   |
    +--------------------+----------+----------------+
    7 rows in set (0.000 sec)
    
  16. 显示其年龄大于平均年龄的同学的名字

    MariaDB [hellodb]> select name,age from students where age > (select avg(age) from students);
    +--------------+-----+
    | name         | age |
    +--------------+-----+
    | Xie Yanke    |  53 |
    | Ding Dian    |  32 |
    | Shi Qing     |  46 |
    | Tian Boguang |  33 |
    | Sun Dasheng  | 100 |
    +--------------+-----+
    5 rows in set (0.000 sec)
    
  17. 显示其学习的课程为第1、2,4或第7门课的同学的名字

    MariaDB [hellodb]> select st.stuid,st.name,st.age,soc.courseid,co.course from students st  left outer join scores soc on st.stuid=soc.stuid left outer join courses co on soc.courseid=co.courseid group by soc.courseid having soc.courseid in (1,2,4,7);
    +-------+-------------+-----+----------+----------------+
    | stuid | name        | age | courseid | course         |
    +-------+-------------+-----+----------+----------------+
    |     5 | Yu Yutong   |  26 |        1 | Hamo Gong      |
    |     1 | Shi Zhongyu |  22 |        2 | Kuihua Baodian |
    |     8 | Lin Daiyu   |  17 |        4 | Taiji Quan     |
    |     5 | Yu Yutong   |  26 |        7 | Dagou Bangfa   |
    +-------+-------------+-----+----------+----------------+
    4 rows in set (0.000 sec)
    
  18. 显示其成员数最少为3个的班级的同学中年龄大于同班同学平均年龄的同学

    MariaDB [hellodb]> select * from students s  left outer join (select  classid,count(*) num,avg(age) avgage from students group by classid having num >=3 and classid is not null) as nums on s.classid=nums.classid group by s.stuid having age > avgage ;
    +-------+---------------+-----+--------+---------+-----------+---------+------+---------+
    | StuID | Name          | Age | Gender | ClassID | TeacherID | classid | num  | avgage  |
    +-------+---------------+-----+--------+---------+-----------+---------+------+---------+
    |     2 | Shi Potian    |  22 | M      |       1 |         7 |       1 |    4 | 20.5000 |
    |     3 | Xie Yanke     |  53 | M      |       2 |        16 |       2 |    3 | 36.0000 |
    |     4 | Ding Dian     |  32 | M      |       4 |         4 |       4 |    4 | 24.7500 |
    |     5 | Yu Yutong     |  26 | M      |       3 |         1 |       3 |    4 | 20.2500 |
    |    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |       6 |    4 | 20.7500 |
    |    16 | Xu Zhu        |  21 | M      |       1 |      NULL |       1 |    4 | 20.5000 |
    |    17 | Lin Chong     |  25 | M      |       4 |      NULL |       4 |    4 | 24.7500 |
    |    18 | Hua Rong      |  23 | M      |       7 |      NULL |       7 |    3 | 19.6667 |
    |    21 | Huang Yueying |  22 | F      |       6 |      NULL |       6 |    4 | 20.7500 |
    +-------+---------------+-----+--------+---------+-----------+---------+------+---------+
    9 rows in set (0.000 sec)
    
  19. 统计各班级中年龄大于全校同学平均年龄的同学

MariaDB [hellodb]> select * from students where age > (select avg(age) from students);
+-------+--------------+-----+--------+---------+-----------+
| StuID | Name         | Age | Gender | ClassID | TeacherID |
+-------+--------------+-----+--------+---------+-----------+
|     3 | Xie Yanke    |  53 | M      |       2 |        16 |
|     4 | Ding Dian    |  32 | M      |       4 |         4 |
|     6 | Shi Qing     |  46 | M      |       5 |      NULL |
|    13 | Tian Boguang |  33 | M      |       2 |      NULL |
|    25 | Sun Dasheng  | 100 | M      |    NULL |      NULL |
+-------+--------------+-----+--------+---------+-----------+
5 rows in set (0.000 sec)

xtrabackup备份和还原数据库练习

1 安装xtrabackup包
[root@centos8 ~]#yum -y install percona-xtrabackup-80-8.0.23-16.1.el8.x86_64.rpm
2 在原主机做完全备份到/backup
[root@centos8 ~]#mkdir /backup
[root@centos8 ~]#xtrabackup -uroot --backup --target-dir=/backup/base
#目标主机无需创建/backup目录,直接复制目录本身
[root@centos8 ~]#scp -r /backup/ 目标主机:/
3 在目标主机上还原
注意:恢复主机MySQL服务停止,并且数据目录为空
1)预准备:确保数据一致,提交完成的事务,回滚未完成的事务
[root@centos8 ~]#yum -y install percona-xtrabackup-80-8.0.23-16.1.el8.x86_64.rpm
[root@centos8 ~]#xtrabackup --prepare --target-dir=/backup/base
2)复制到数据库目录
注意:数据库目录必须为空,MySQL服务不能启动
[root@centos8 ~]#xtrabackup --copy-back --target-dir=/backup/base
3)还原属性
[root@centos8 ~]#chown -R mysql:mysql /var/lib/mysql
4)启动服务
[root@centos8 ~]#service mysqld start

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

主从复制

#主节点,10.0.0.134
dnf -y install mysqld-server;
vim /etc/my.cnf
[mysqld]
server-id=134
log-bin
systemctl restart mysqld
mysql
:43: (root@localhost) [(none)]> show master logs;
+----------------------+-----------+-----------+
| Log_name             | File_size | Encrypted |
+----------------------+-----------+-----------+
| localhost-bin.000001 |       157 | No        |
+----------------------+-----------+-----------+
#创建复制用户
mysql>create user 'repluser'@'10.0.0.%';
mysql>grant replication slave on *.* to 'repluser'@'10.0.0.%';

#从节点,10.0.0.136
vim /etc/my.cnf
[mysqld]
server-id=136
log-bin
systemctl restart mysqld
mysql
:52: (root@localhost) [(none)]> change master to master_host='10.0.0.134',
    -> master_user='repluser',master_password='',
    -> master_port=3306,master_log_file='localhost-bin.000001',
    -> master_log_pos=157;
0: (root@localhost) [(none)]> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 10.0.0.134
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: localhost-bin.000001
          Read_Master_Log_Pos: 621
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 794
        Relay_Master_Log_File: localhost-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

主主复制仅作特点描述

主主复制:两个节点,都可以更新数据,并且互为主从

容易产生的问题:数据不一致;因此慎用

考虑要点:自动增长id

配置一个节点使用奇数id

auto_increment_offset=1 #开始点
auto_increment_increment=2 #增长幅度

另一个节点使用偶数id

auto_increment_offset=2
auto_increment_increment=2

主主复制的配置步骤:

  1. 各节点使用一个惟一server_id
  2. 都启动binary log和relay log
  3. 创建拥有复制权限的用户账号
  4. 定义自动增长id字段的数值范围各为奇偶
  5. 均把对方指定为主节点,并启动复制线程
    范例:实现两个节点的主主复制模型

半同步复制

#主节点,10.0.0.134
[root@localhost ~]# rpm -ql mysql-server |grep semisync
/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_replica.so
/usr/lib64/mysql/plugin/semisync_slave.so
/usr/lib64/mysql/plugin/semisync_source.so
mysql
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; #永久安装插件
mysql>SHOW PLUGINS; #查看插件
quit
[root@localhost ~]#vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=134
log-bin
rpl_semi_sync_master_enabled=ON
[root@localhost ~]# systemctl restart mysqld
mysql
mysql>SHOW GLOBAL VARIABLES LIKE '%semi%';
mysql> SHOW GLOBAL STATUS LIKE '%semi%';

#从节点,10.0.0.136
mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
[root@localhost ~]#vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=136
log-bin
rpl_semi_sync_slave_enabled=ON
[root@localhost ~]# systemctl restart mysqld
#注意:如果已经实现主从复制,需要stop slave;start slave;
mysql> stop slave;
mysql> start slave;
mysql> SHOW GLOBAL STATUS LIKE '%semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)


#验证方法
#从节点10.0.0.136
mysql
stop slave;

#主节点10.0.0.134
Database changed
:07: (root@localhost) [hellodb]> insert teachers values(7,'T',19,'F');
Query OK, 1 row affected (10.00 sec)

#从节点10.0.0.136
start slave

#主节点10.0.0.134
:07: (root@localhost) [hellodb]> insert teachers values(8,'U',20,'F');
Query OK, 1 row affected (0.00 sec)

#从节点10.0.0.136
:08: (root@localhost) [(none)]> use hellodb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
:08: (root@localhost) [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
|   5 | X             |  18 | M      |
|   6 | Z             |  19 | F      |
|   7 | T             |  19 | F      |
|   8 | U             |  20 | F      |
+-----+---------------+-----+--------+
8 rows in set (0.00 sec)

用mycat实现mysql的读写分离

时间不够,而且目前mycat在中型企业往上已经很少用了,先不做

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

暂时无时间实现,日后看重要程度和时间选择补回还是跳过

mysql如何实现崩溃后恢复?

通过mysqldump,xtrabackup等备份工具进行恢复,先在异机尝试恢复数据库,恢复成功后再替代原有数据库

防止手段,使用Galera部署mysql集群

myisam和innodb各自在什么场景使用?"

MyISAM 存储引擎适用场景

  • 只读(或者写较少)
  • 表较小(可以接受长时间进行修复操作)

MyISAM 引擎特点

  • 不支持事务
  • 表级锁定
  • 读写相互阻塞,写入不能读,读时不能写
  • 只缓存索引
  • 不支持外键约束
  • 不支持聚簇索引
  • 读取数据较快,占用资源较少
  • 不支持MVCC(多版本并发控制机制)高并发
  • 崩溃恢复性较差
  • MySQL5.5.5 前默认的数据库引擎

InnoDB引擎适用场景

与myisam相反,目前已经是mysql主流存储引擎

InnoDB引擎特点

  • 行级锁
  • 支持事务,适合处理大量短期事务
  • 读写阻塞与事务隔离级别相关
  • 可缓存数据和索引
  • 支持聚簇索引
  • 崩溃恢复性更好
  • 支持MVCC高并发
  • 从MySQL5.5后支持全文索引
  • 从MySQL5.5.5开始为默认的数据库引擎
posted @ 2023-09-11 23:05  HUAJEE  阅读(38)  评论(0)    收藏  举报