1、 导入hellodb.sql生成数据库
(1) 在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄
select name,age from students where age>25 and gender='m' ;
(2) 以ClassID为分组依据,显示每组的平均年龄
select classid,avg(age) from students where classid is not null group by classid;
(3) 显示第2题中平均年龄大于30的分组及平均年龄
select classid,avg(age) as avgage from students where classid is not null group by classid having avgage>30;
(4) 显示以L开头的名字的同学的信息
select * from students where name like 'l%';
2、数据库授权magedu用户,允许192.168.1.0/24网段可以连接mysql
查看数据库版本
$ mysql --version
mysql Ver 15.1 Distrib 10.2.41-MariaDB, for Linux (x86_64) using readline 5.1
服务端登录MySQL建立测试库
$ mysql
MariaDB [(none)]> create database magedu;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| magedu |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
授权
MariaDB [(none)]> grant all privileges on magedu.* to 'magedu'@'10.10.6.0/24' identified by '123123' with grant option;
Query OK, 1 rows affected (0.00 sec)
// 其中,关键字 “privileges” 可以省略。
// all privileges:表示将所有权限授予给用户。也可指定具体的权限,如:SELECT、CREATE、DROP等。
// on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写“*”表示所有数据库,所有表。如果我要指定将权限应用到test库的user表中,可以这么写:test.user
// to:将权限授予哪个用户。格式:”用户名”@”登录IP或域名”。%表示没有限制,在任何主机都可以登录。比如:”yangxin”@”192.168.0.%”,表示yangxin这个用户只能在192.168.0IP段登录
// identified by:指定用户的登录密码
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> select host,user from mysql.user;
+--------------+--------+
| host | user |
+--------------+--------+
| 10.10.6.0/24 | magedu |
| 127.0.0.1 | root |
| ::1 | root |
| localhost | |
| localhost | root |
| mysql-01 | |
| mysql-01 | root |
+--------------+--------+
7 rows in set (0.00 sec)
登录其他服务器,下载mysql客户端
$ yum install mysql -y
测试远程连接(若无反应根据文章末尾操作)
$ mysql -umagedu -h 10.10.6.188 magedu -p
Enter password:
MariaDB [magedu]> show tables;
Empty set (0.00 sec)
MariaDB [magedu]> show grants;
+-----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]/24 |
+-----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON `magedu`.* TO 'magedu'@'10.10.6%' IDENTIFIED BY PASSWORD '*E56A114692FE0DE073F9A1DD68A00EEB9703F3F1' WITH GRANT OPTION |
+-----------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
MariaDB [magedu]> quit
Bye
服务端测试权限回收
MariaDB [(none)]> revoke all on magedu.* from 'magedu'@'10.10.6.0/24';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
删除用户
MariaDB [(none)]> drop user 'magedu'@'10.10.6.0/24';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> select host,user from mysql.user;
+-----------+------+
| host | user |
+-----------+------+
| 127.0.0.1 | root |
| ::1 | root |
| localhost | |
| localhost | root |
| mysql-01 | |
| mysql-01 | root |
+-----------+------+
6 rows in set (0.00 sec)
客户端再次远程登录,提示失败
$ mysql -umagedu -h 10.10.6.188 magedu -p
Enter password:
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
PS:客户端登录无反应,可能是:
1、检查3306端口是否被防火墙屏蔽,开启3306端口
$ sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
// -A 表示append向iptables的INPUT链中追加
// -p 表示‘协议’ 后跟tcp
// --dport 端口号
// -j ACCEPT 这个参数用于指定匹配的数据包的目标。用在这里表示接受和允许符合上述标准的数据包通过
2、MySQL服务端未开启远程连接
主要有这么几个配置文件,mysql和mariadb略有不同
/etc/mysql/mariadb.cnf 默认配置文件,
/etc/mysql/conf.d/*.cnf 设置全局项的文件
“/etc/mysql/mariadb.conf.d/*.cnf” 设置与MariaDB相关的信息
“~/.my.cnf” 设置该账户对应的信息
这也就是为什么我们在my.cnf做相关设置有的时候不起作用(可能在其他配置文件中有相同的项,MySQL最终采用的是另外一个文件中的设置);
根据官方的说法,MariaDB为了提高安全性,默认只监听127.0.0.1中的3306端口并且禁止了远程的TCP链接,我们可以通过下面两步来开启MySQL的远程服务:
注释掉skip-networking选项来开启远程访问.
注释bind-address项,该项表示运行哪些IP地址的机器连接,允许所有远程的机器连接
拓展
MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户
grant select on testdb.* to common_user@'%'
grant insert on testdb.* to common_user@'%'
grant update on testdb.* to common_user@'%'
grant delete on testdb.* to common_user@'%'
或者,用一条 MySQL 命令来替代:
grant select, insert, update, delete on testdb.* to common_user@'%'
grant 创建、修改、删除 MySQL 数据表结构权限。
grant create on testdb.* to developer@'192.168.0.%';
grant alter on testdb.* to developer@'192.168.0.%';
grant drop on testdb.* to developer@'192.168.0.%';
grant 操作 MySQL 外键权限。
grant references on testdb.* to developer@'192.168.0.%';
grant 操作 MySQL 临时表权限。
grant create temporary tables on testdb.* to developer@'192.168.0.%';
MySQL grant 权限,分别可以作用在多个层次上。
1. grant 作用在整个 MySQL 服务器上:
grant select on *.* to dba@localhost; -- dba 可以查询 MySQL 中所有数据库中的表。
grant all on *.* to dba@localhost; -- dba 可以管理 MySQL 中的所有数据库
2. grant 作用在单个数据库上:
grant select on testdb.* to dba@localhost; -- dba 可以查询 testdb 中的表。
3. grant 作用在单个数据表上:
grant select, insert, update, delete on testdb.orders to dba@localhost;
这里在给一个用户授权多张表时,可以多次执行以上语句。例如:
grant select(user_id,username) on smp.users to mo_user@'%' identified by '123345';
grant select on smp.mo_sms to mo_user@'%' identified by '123345';
4. grant 作用在表中的列上:
grant select(id, se, rank) on testdb.apache_log to dba@localhost;
5. grant 作用在存储过程、函数上:
grant execute on procedure testdb.pr_add to 'dba'@'localhost'
grant execute on function testdb.fn_add to 'dba'@'localhost'