在同步时,对删除和修改都比较慎重(监控同步时)
mysql主从搭建 前提软件libaio,rsync
1、主 2、从 3、同步 4、测试
注意:先执行从服务器的脚本,再执行主服务器脚本
1.master-mysql配置脚本
先要在主服务器上配置免密登录 ssh-keygen ssh-copy-id root@10.0.0.12 vim mysql.sh
#!/bin/bash echo "安装master-mysql" sleep 3 #下载依赖软件包 yum list installed | grep libaio &> /dev/null if [ $? -ne 0 ];then yum -y install libaio &> /dev/null fi echo "libaio已经安装" yum list installed | grep rsync &> /dev/null if [ $? -ne 0 ];then yum -y install rsync &> /dev/null fi echo "rsync已经安装" yum list installed | grep ntpdate.x86_64 &> /dev/null if [ $? -ne 0 ];then yum -y install ntpdate.x86_64 &> /dev/null fi echo "ntpdate.x86_64已经安装" ntpdate cn.ntp.org.cn sleep 3 #解压软件包 tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar sleep 3 tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz echo "软件包已经解压" #转移到指定工作目录 cp -r mysql-8.0.33-linux-glibc2.12-x86_64 /usr/local/mysql cd /usr/local/mysql/ #创建工作文件目录 mkdir mysql-files #创建mysql系统用户 id mysql if [ $? -ne 0 ];then useradd -r -s /sbin/nologin mysql fi echo "mysql用户已经创建" #修改工作文件目录的权限和所属主,所属组 chown mysql:mysql ./mysql-files/ chmod 750 ./mysql-files/ #删除/etc/my.cnf文件 rm -rf /etc/my.cnf #初始化mysql /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ sleep 3 #加密 /usr/local/mysql/bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data echo "加密成功" #设置service服务 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql8 #开启mysql service mysql8 start if [ $? -ne 0 ];then echo "mysql开启失败" else echo "mysql开启成功" fi sleep 3
#编辑配置文件my.cnf cat >> /usr/local/mysql/my.cnf << EOF [mysqld] basedir=/usr/local/mysql datadir=/usr/local/mysql/data socket=/tmp/mysql.sock activate_all_roles_on_login=on port=3306 log-error=/usr/local/mysql/data/db01-master.err log-bin=/usr/local/mysql/data/binlog server-id=10 character_set_server=utf8mb4 EOF #重启mysql service mysql8 restart if [ $? -ne 0 ];then echo "mysql重启失败" else echo "mysql重启成功" fi sleep 3 #数据同步 echo "开始配置数据同步,如果不配置请在3秒内按ctrl+c进行打断" sleep 3 service mysql8 stop echo "mysql服务已经停止" rm -rf /usr/local/mysql/data/auto.cnf echo "auto.cnf文件已经删除" yum -y install rsync &> /dev/null if [ $? -eq 0 ];then echo "rsync软件已经安装成功" else echo "rsync软件安装失败" fi rsync -av /usr/local/mysql/data root@10.0.0.12:/usr/local/mysql/ &> /etc/null if [ $? -eq 0 ];then echo "data目录同步成功" else echo "data目录同步失败" fi sleep 3 #开启mysql service mysql8 start if [ $? -ne 0 ];then echo "mysql开启失败" else echo "mysql开启成功" fi #修改环境变量 sed -i '$aexport PATH=/usr/local/mysql/bin:$PATH' /etc/profile #激活配置 source /etc/profile if [ $? -ne 0 ];then echo "profile文件激活失败" fi echo "完成master-mysql配置" source mysql.sh # source /etc/profile //激活profile文件 mysql -p'hz),bpIhb2x+' //密码为上面初始化之后自动生成的
2.slave-mysql配置脚本
#!/bin/bash echo "安装slave-mysql" sleep 3 #下载依赖软件包 yum list installed | grep libaio &> /dev/null if [ $? -ne 0 ];then yum -y install libaio &> /dev/null fi echo "libaio已经安装" yum list installed | grep rsync &> /dev/null if [ $? -ne 0 ];then yum -y install rsync &> /dev/null fi echo "rsync已经安装" yum list installed | grep ntpdate.x86_64 &> /dev/null if [ $? -ne 0 ];then yum -y install ntpdate.x86_64 &> /dev/null fi echo "ntpdate.x86_64已经安装" ntpdate cn.ntp.org.cn sleep 3 #解压软件包 tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar sleep 3 tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz echo "软件包已经解压" #转移到指定工作目录 cp -r mysql-8.0.33-linux-glibc2.12-x86_64 /usr/local/mysql cd /usr/local/mysql/ #创建工作文件目录 mkdir mysql-files #创建mysql系统用户 id mysql if [ $? -ne 0 ];then useradd -r -s /sbin/nologin mysql fi echo "mysql用户已经创建" #修改工作文件目录的权限和所属主,所属组 chown mysql:mysql ./mysql-files/ chmod 750 ./mysql-files/ #删除/etc/my.cnf文件 rm -rf /etc/my.cnf #设置service服务 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql8 #编辑配置文件my.cnf cat >> /usr/local/mysql/my.cnf << EOF [mysqld] basedir=/usr/local/mysql datadir=/usr/local/mysql/data socket=/tmp/mysql.sock activate_all_roles_on_login=on port=3310 log-error=/usr/local/mysql/data/db01-slave.err relay-log=/usr/local/mysql/data/relaylog server-id=11 character_set_server=utf8mb4 EOF #数据同步 echo "开始配置数据同步,如果不配置请在3秒内按ctrl+c进行打断" sleep 3 yum -y install rsync &> /dev/null if [ $? -eq 0 ];then echo "rsync软件已经安装成功" else echo "rsync软件安装失败" fi #修改环境变量 sed -i '$aexport PATH=/usr/local/mysql/bin:$PATH' /etc/profile #激活配置 source /etc/profile if [ $? -ne 0 ];then echo "profile文件激活失败" fi echo "完成slave-mysql配置,等待master-mysql同步data" echo "注意该数据库端口号为3310" source mysql.sh
两个脚本都运行完之后
3.主服务器配置
systemctl stop firewalld //关闭防火墙 mysql> alter user 'root'@'localhost' identified by '123'; Query OK, 0 rows affected (0.15 sec) //修改root密码 mysql> create user 'slave'@'%' identified by '123'; Query OK, 0 rows affected (0.03 sec) //创建slave用户 mysql> grant replication slave on *.* to 'slave'@'%'; Query OK, 0 rows affected (0.02 sec) //授予replication slave权限 mysql> flush privileges; //重新加载权限表 Query OK, 0 rows affected (0.00 sec) mysql> flush tables with read lock; //刷新所有表并施加一个全局读锁 Query OK, 0 rows affected (0.01 sec) mysql> show master status; //查看主服务器当前二进制日志的状态信息 +---------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------+----------+--------------+------------------+-------------------+ | binlog.000003 | 1178 | | | | +---------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
4.从服务器配置
service mysql8 start source /etc/profile //激活profile文件 mysql -uslave -p123 -h10.0.0.13 -P3306 --get-server-public-key //获取服务器的公共密钥 mysql> quit Bye mysql -P3310 -p'hz),bpIhb2x+' //密码为主服务器原先生成的密码 mysql> alter user 'root'@'localhost' identified by '123'; Query OK, 0 rows affected (0.08 sec) //修改root密码 mysql> change master to -> master_host='10.0.0.13', -> master_user='slave', -> master_password='123', -> master_port=3306, -> master_log_file='binlog.000003', -> master_log_pos=1178; Query OK, 0 rows affected, 9 warnings (0.02 sec) mysql> start slave; Query OK, 0 rows affected, 1 warning (0.03 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for source to send event Master_Host: 10.0.0.13 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binlog.000003 Read_Master_Log_Pos: 1178 Relay_Log_File: relaylog.000002 Relay_Log_Pos: 323 Relay_Master_Log_File: binlog.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes
5.主服务器配置
mysql> unlock tables; Query OK, 0 rows affected (0.00 sec)
全部配置完成
1、新增 insert into 库名称.表名(id,username,password) values(1,"abc","123"); insert into 表名称 values(1,"name","word"); insert into 表名称 select * from 其他表; inster into 表名称 values(),(); 2、删除 delete from 表名; delete from tablename where id=3; delete from tablename where age>8; delect from tablename where name on("a","b","c"); 3、修改 update mysql.user set host='%' where name='root' update user set password='abc' where username="zhangsan" 4、查询 单表查询:select 字段名列表 from 表名,索引;
6.MySQL 函 数介绍
1、聚合函数
只有select⼦句和 having ⼦句、order by ⼦句中能使⽤聚合函数,where ⼦句不能使⽤聚合函数。当使⽤聚合查询以后,不能使⽤where条件,如果要添加条件,就使⽤having。
常⽤聚合``函数 | |
---|---|
统计表中数据的⾏数或者统计指定列不为空值的数据⾏个数 | select count(*或表头名) from 表名; |
计算指定列的最⼤值,如果指定列是字符串类型(⽂字类型)则使⽤字符⾸拼排序 | select max(表头名) from 表名; |
计算指定列的最⼩值,如果指定列是字符串类型(⽂字类型)则使⽤字符⾸拼排序 | select min(表头名) from 表名; |
计算指定列的数值和,如果指定列不是数值类型则计算结果为 0 | select sum(表头名) from 表名; |
计算指定列的平均值,如果指定列不是数值类型则计算结果为 0 | select avg(表头名) from 表名; |
2、其他常⽤函数
1.⽇期函数
2.数字函数
3.字符串函数
3.MySQL 分组查询
语法:
select 聚合函数(表头名 1),表头名 2 from 数据表名 group by 表 头名;
select 聚合函数(表头名) 临时表头名,真实表头名 from 数据表名 group by 真实表头名;
若⽤ group by 分组查询语句,必须加⼊聚合函数,否则报错 (踩坑)
mysql> create table 学⽣表(序号 int,姓名 char(16),年龄 int,班级 int); Query OK, 0 rows affected (0.01 sec) #新建⼀个学⽣表,表头有:序号,数字形式;姓名,⽂本字符串形式;年龄,数字形式;班级,数字形式。 mysql> desc 学⽣表; +--------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+----------+------+-----+---------+-------+ | 序号 | int(11) | YES | | NULL | | | 姓名 | char(16) | YES | | NULL | | | 年龄 | int(11) | YES | | NULL | | | 班级 | int(11) | YES | | NULL | | +--------+----------+------+-----+---------+-------+ 4 rows in set (0.00 sec) #展示学⽣表表头信息 insert into 学⽣表 values(1,'tom',15,101); insert into 学⽣表 values(2,'mike',16,102); insert into 学⽣表 values(3,'john',14,103); insert into 学⽣表 values(4,'lili',15,102); insert into 学⽣表 values(5,'jack',15,101); insert into 学⽣表 values(6,'xiaoming',17,103); #向学⽣表内插⼊学⽣信息 mysql> select * from 学⽣表; +--------+----------+--------+--------+ | 序号 | 姓名 | 年龄 | 班级 | +--------+----------+--------+--------+ | 1 | tom | 15 | 101 | | 2 | mike | 16 | 102 | | 3 | john | 14 | 103 | | 4 | lili | 15 | 102 | | 5 | jack | 15 | 101 | | 6 | xiaoming | 17 | 103 | +--------+----------+--------+--------+ 6 rows in set (0.00 sec) #查看表内学⽣信息 mysql> select avg(年龄) from 学⽣表; +-------------+ | avg(年龄) | +-------------+ | 15.3333 | +-------------+ 1 row in set (0.00 sec) #计算所有学⽣平均年龄,avg:计算平均值,计算⾮数字,结果为0 mysql> select avg(年龄) from 学⽣表 group by 班级; +-------------+ | avg(年龄) | +-------------+ | 15.0000 | | 15.5000 | | 15.5000 | +-------------+ 3 rows in set (0.00 sec) #通过group by语法计算每个班的学⽣平均年龄 mysql> select avg(年龄) 平均年龄,班级 from 学⽣表 group by 班级; +--------------+--------+ | 平均年龄 | 班级 | +--------------+--------+ | 15.0000 | 101 | | 15.5000 | 102 | | 15.5000 | 103 | +--------------+--------+ 3 rows in set (0.00 sec) #“平均年龄”:这个是⾃⼰临时命名的表头名,也可以不写,那么就是下⾯的效果 mysql> select avg(年龄),班级 from 学⽣表 group by 班级; +-------------+--------+ | avg(年龄) | 班级 | +-------------+--------+ | 15.0000 | 101 | | 15.5000 | 102 | | 15.5000 | 103 | +-------------+--------+ 3 rows in set (0.00 sec) mysql> select min(年龄) 最⼩年龄,班级 from 学⽣表 group by 班级; +--------------+--------+ | 最⼩年龄 | 班级 | +--------------+--------+ | 15 | 101 | | 15 | 102 | | 14 | 103 | +--------------+--------+ 3 rows in set (0.00 sec) #avg也可以改成min最⼩值、max最⼤值、sum加法函数等运算⽅式 mysql> select count(*) 总⼈数,班级 from 学⽣表 group by 班级; +-----------+--------+ | 总⼈数 | 班级 | +-----------+--------+ | 2 | 101 | | 2 | 102 | | 2 | 103 | +-----------+--------+ 3 rows in set (0.00 sec) #也可以⽤count统计函数计算每个班的总⼈数 #这些count、avg、max、min、sum就是聚合函数,分组查询必须有这些函数的其⼀。
4.MySQL ⼦语句查询
⼦查询是指⼀个查询语句嵌套在另⼀个查询语句内部的查询;
该查询语句可以嵌套在⼀个 SELECT、SELECT...INTO、 INSERT...INTO 等语句中。
在执⾏查询时,⾸先会执⾏⼦查询中的语句,再将返回的结果作为外层查询的过滤条件。
在⼦查询中通常可以使⽤⽐较运算符和 IN、EXISTS、ANY、 ALL 等关键字。
例如 select * from class where cid=(select classid from student where sname='张三');
1.⽐较运算符的⼦查询
也就是⽤“=”、“<”、“>”这类⽐较运算符
mysql> create table class(cid int(4) not null primary key,cname varchar(20)); Query OK, 0 rows affected (0.05 sec) # 创建班级表 mysql> create table student (sid int(4) not null primary key, sname varchar (20), sage int (2), classid int (4) not null); Query OK, 0 rows affected (0.03 sec) # 创建学⽣表 insert into class values(1001,'Java'); insert into class values(1002,'C++'); insert into class values(1003,'Python'); insert into class values(1004,'PHP'); insert into class values(1005,'Android'); # 向班级表插⼊数据 insert into student values(1,'张三',20,1001); insert into student values(2,'李四',21,1002); insert into student values(3,'王五',24,1003); insert into student values(4,'赵六',23,1004); insert into student values(5,'⼩明',21,1001); insert into student values(6,'⼩红',26,1001); insert into student values(7,'⼩亮',27,1002); # 向学⽣表插⼊数据 mysql> select * from class where cid=(select classid from student where sname='张三'); +------+-------+ | cid | cname | +------+-------+ | 1001 | Java | +------+-------+ 1 row in set (0.00 sec) #查询张三同学所在班级的信息 mysql> select * from class where cid>(select classid from student where sname='张三'); +------+---------+ | cid | cname | +------+---------+ | 1002 | C++ | | 1003 | Python | | 1004 | PHP | | 1005 | Android | +------+---------+ 4 rows in set (0.03 sec) # 查询⽐张三同学所在班级编号还⼤的班级的信息
2、exists 关键字的⼦查询
exists 关键字后⾯的参数可以是任意⼀个⼦查询, 它不产⽣任何数据,只返回 true 或 false。⽽当返回值为 true 时外层查询才会执⾏。
相当于内层句⼦是⼀个判断句式。
mysql> select * from class where exists (select * from student where sname='王五'); +------+---------+ | cid | cname | +------+---------+ | 1001 | Java | | 1002 | C++ | | 1003 | Python | | 1004 | PHP | | 1005 | Android | +------+---------+ 5 rows in set (0.00 sec) # 假如王五同学在学⽣表中则从班级表查询所有班级信息
5.MySQL 多表联合查询
1、交叉连接查询
交叉连接返回的结果是被连接的两个表中所有数据⾏的笛卡尔积;
⽐如:集合A={a,b},集合B={0,1,2},则集合A和B的笛卡尔积为 {(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)。所以,交叉连接也被称为笛卡尔连接。
语法: select * from 表1 cross join 表2;
mysql> select * from student cross join class; +-----+--------+------+---------+------+---------+ | sid | sname | sage | classid | cid | cname | +-----+--------+------+---------+------+---------+ | 1 | 张三 | 20 | 1001 | 1001 | Java | | 1 | 张三 | 20 | 1001 | 1002 | C++ | | 1 | 张三 | 20 | 1001 | 1003 | Python | | 1 | 张三 | 20 | 1001 | 1004 | PHP | | 1 | 张三 | 20 | 1001 | 1005 | Android | | 2 | 李四 | 21 | 1002 | 1001 | Java | | 2 | 李四 | 21 | 1002 | 1002 | C++ | | 2 | 李四 | 21 | 1002 | 1003 | Python | | 2 | 李四 | 21 | 1002 | 1004 | PHP | | 2 | 李四 | 21 | 1002 | 1005 | Android | | 3 | 王五 | 24 | 1003 | 1001 | Java | | 3 | 王五 | 24 | 1003 | 1002 | C++ | | 3 | 王五 | 24 | 1003 | 1003 | Python | | 3 | 王五 | 24 | 1003 | 1004 | PHP | | 3 | 王五 | 24 | 1003 | 1005 | Android | | 4 | 赵六 | 23 | 1004 | 1001 | Java | | 4 | 赵六 | 23 | 1004 | 1002 | C++ | | 4 | 赵六 | 23 | 1004 | 1003 | Python | | 4 | 赵六 | 23 | 1004 | 1004 | PHP | | 4 | 赵六 | 23 | 1004 | 1005 | Android | | 5 | ⼩明 | 21 | 1001 | 1001 | Java | | 5 | ⼩明 | 21 | 1001 | 1002 | C++ | | 5 | ⼩明 | 21 | 1001 | 1003 | Python | | 5 | ⼩明 | 21 | 1001 | 1004 | PHP | | 5 | ⼩明 | 21 | 1001 | 1005 | Android | | 6 | ⼩红 | 26 | 1001 | 1001 | Java | | 6 | ⼩红 | 26 | 1001 | 1002 | C++ | | 6 | ⼩红 | 26 | 1001 | 1003 | Python | | 6 | ⼩红 | 26 | 1001 | 1004 | PHP | | 6 | ⼩红 | 26 | 1001 | 1005 | Android | | 7 | ⼩亮 | 27 | 1002 | 1001 | Java | | 7 | ⼩亮 | 27 | 1002 | 1002 | C++ | | 7 | ⼩亮 | 27 | 1002 | 1003 | Python | | 7 | ⼩亮 | 27 | 1002 | 1004 | PHP | | 7 | ⼩亮 | 27 | 1002 | 1005 | Android | +-----+--------+------+---------+------+---------+ 35 rows in set (0.00 sec) #两个表交叉连接,class表的cid和student表的classid相乘
2、多表联合查询
语法:select 查询字段1,查询字段2, ... from 表1 join 表2 join ... on 表1.关系字段=表2.关系字段=...;
join:联合
on:条件
mysql> select sname,cname from student inner join class on student.classid=class.cid; +--------+--------+ | sname | cname | +--------+--------+ | 张三 | Java | | 李四 | C++ | | 王五 | Python | | 赵六 | PHP | | ⼩明 | Java | | ⼩红 | Java | | ⼩亮 | C++ | +--------+--------+ 7 rows in set (0.00 sec) # 查询学⽣姓名及其所学习的学科
6.MySQL 授权
1、MySQL 基础权限
2、权限语法
7.、MySQL 触发器
1、概念
触发器是⼀种特殊的存储过程,它在插⼊,删除或修改特定表中的数据时触发执⾏,它⽐数据库本身标准的功能有更精细和更复杂的数据控制能⼒。
1、例如在某⼀个时间触发什么事情
2、例如不允许股票价格的升幅⼀次超过%10
3、审计功能,某⼀个⼈登录会记录所有的操作
2、触发器语法
create trigger 触发器名称 触发的时机 触发的动作 on 表名 for each row 触发器状态
1、语法的红字为固定格式
2、触发器名称:⾃定义
3、触发的时机:before(之前) 或 after(之后),在执⾏动作之前还是之后
4、触发的动作:指的激发触发程序的语句类型(插⼊、更新、删除表或数据等)
5、each row:操作的每⼀⾏都会被监控
6、触发器状态:在触发的动作之前或之后做什么事情,⽐如当我删 了表 1 的某条数据后,⾃动清空表 2。
3、触发器创建的四要素
(1)监视地点:table(表)
(2)监视事件:insert(插⼊)、update(更新)、delete(删除) 等动作
(3)触发时间:before(之前)、after(之后)
(4)触发事件:在监视事件之前或之后,对当前表或其他表的插 ⼊、更新、删除等动作
4、触发器实例
#查看数据库内的所有表 mysql> show tables; +--------------+ | Tables_in_yh | +--------------+ | class | | it | | student | +--------------+ 3 rows in set (0.00 sec) #创建触发器规则 #命令⼤意:创建名为deltable的触发器,在执⾏每⼀条的删除class表命令之后,删除student表 mysql> create trigger deltable after delete on class for each row delete from student; Query OK, 0 rows affected (0.00 sec) #查看触发器 mysql> show triggers\G; *************************** 1. row *************************** Trigger: deltable Event: DELETE Table: class Statement: delete from student Timing: AFTER Created: 2023-09-26 20:46:24.53 sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_ DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AU TO_CREATE_USER,NO_ENGINE_SUBSTITUTION Definer: root@localhost character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: latin1_swedish_ci 1 row in set (0.00 sec) ERROR: No query specified #查看当前数据库下的所有数据表 mysql> show tables; +--------------+ | Tables_in_yh | +--------------+ | class | | it | | student | +--------------+ 3 rows in set (0.00 sec) #查看⼀下class表的内容,因为要⽤该表做示范 mysql> select * from class; +------+---------+ | cid | cname | +------+---------+ | 1001 | Java | | 1002 | C++ | | 1003 | Python | | 1004 | PHP | | 1005 | Android | +------+---------+ 5 rows in set (0.01 sec) #查看⼀下student表的内容,因为要⽤该表做示范 mysql> select * from student; +-----+----------+------+---------+ | sid | sname | sage | classid | +-----+----------+------+---------+ | 1 | mike | 17 | 1001 | | 2 | john | 18 | 1002 | | 3 | lili | 19 | 1003 | | 4 | zhangsan | 20 | 1004 | | 5 | tom | 21 | 1005 | +-----+----------+------+---------+ 5 rows in set (0.00 sec) #删除class表中cid为1005的整⾏数据,也就是执⾏之前设置的触发动作 mysql> delete from class where cid=1005; Query OK, 1 row affected (0.00 sec) #因为触发器执⾏,所以student表的内容在class表的删除动作后被清空 mysql> select * from student; Empty set (0.00 sec) #删除触发器 mysql> drop trigger deltable; Query OK, 0 rows affected (0.00 sec)
8.MySQL 基本优化操作
1、忘记 MySQL 密码
[root@localhost ~]# vim /etc/my.cnf [mysqld] skip-name-resolve #添加该⾏,表示本机跳过MySQL密码验证 skip-grant-tables #添加该⾏,表示登录时,忽略所有的⽤户认证信息,包括⽤户名、密码和权限。 :wq [root@localhost ~]# systemctl restart mysqld.service [root@localhost ~]# mysql #免密时,直接使⽤MySQL命令登录 mysql> use mysql; mysql> update user set authentication_string=password('123') where user="root"; Query OK, 1 row affected, 1 warning (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 1 #更新MySQL⽤户“root”的密码为“123”等。如果⽤户名不叫“root”,那么最后的等号后⾯写你想要改的⽤户名 mysql> select Host,user,authentication_string from user; #这条命令意为:算法对账户明⽂密码加密后的字符串,不⽤看,看不懂,没什么⽤。 mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> exit Bye [root@localhost ~]# mysql -uroot -p123
2、MySQL 存储引擎
1.查看数据库使⽤的存储引擎
mysql> use yh; #查看存储引擎时,必须要切换到某个数据库 Database changed mysql> show tables; #查看当前yh数据库下的所有数据表 +--------------+ | Tables_in_yh | +--------------+ | class | | it | | student | +--------------+ 3 rows in set (0.00 sec) mysql> show table status \G; #查看所有数据表的存储引擎 *************************** 1. row *************************** Name: class Engine: InnoDB #存储引擎,常⽤的还有MyISAM Create_time: 2023-09-25 09:27:28 #数据表创建时间 Update_time: 2023-09-26 20:57:20 #数据表更新时间 *************************** 2. row *************************** Name: it Engine: InnoDB #存储引擎 Create_time: 2023-09-25 17:55:38 #数据表创建时间 *************************** 3. row *************************** Name: student Engine: InnoDB Create_time: 2023-09-25 10:16:48 #数据表创建时间 Update_time: 2023-09-26 20:57:20 mysql> show table status where name='class' \G; #也可查看单个数据表的存储引擎 *************************** 1. row *************************** Name: class Engine: InnoDB #存储引擎 Version: 10 Row_format: Dynamic Rows: 4 Avg_row_length: 4096 Data_length: 16384 Max_data_length: 0 Index_length: 0 Data_free: 0 Auto_increment: NULL Create_time: 2023-09-25 09:27:28 #创建时间 Update_time: 2023-09-26 20:57:20 #更新时间 Check_time: NULL Collation: latin1_swedish_ci Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec) ERROR: No query specified
2.创建表并指定存储引擎
mysql> create table haha(id int) engine=MyISAM; #创建表haha,并添加数字形式的表头id,指定haha表的存储引擎为MyISAM Query OK, 0 rows affected (0.00 sec) mysql> show table status where name='haha' \G; #查看haha表的存储引擎及其他状态信息 *************************** 1. row *************************** Name: haha Engine: MyISAM #存储引擎
3.修改已存在数据表的存储引擎
mysql> alter table haha engine=InnoDB; #修改已存在的数据表haha的存储引擎 Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show table status where name='haha' \G; #查看haha表状态及存储引擎 *************************** 1. row *************************** Name: haha Engine: InnoDB #存储引擎
4.修改 MySQL 服务的默认存储引擎
[root@localhost ~]# vim /etc/my.cnf [mysqld] default-storage-engine=InnoDB #添加此⾏,当以后再创建表时,存储引擎将改为InnoDB
练习
远程连接数据库的要素
1、username
2、password
3、url mysql ip|域名 数据库名称 端口
别名
select id as 编号,name as 姓名,gender as 性别 from student;
数据分析的基础
1、排序
max
min
2、汇总
count
sum
avg
3、数学进制
二进制
八进制
十进制
十六进制
select max(price) from product;
select * from student order by gender;
select * from student order by gender desc;
select * from student order by gender asc;
当我们对数据进行聚合查询后,不能使用where条件,如果要添加条件就使用having
select gender as 性别,count(gender) as 人数 from student group by gender;
create table product(id int primary key auto_increment,name varchar(45) not null,price float not null,qty int not null);
desc product;
insert into product (name,price,qty) values("香蕉",8.5,200),("苹果",12.5,400),("菠萝",12.4,70),("哈密瓜",18.3,400);
select * from product;
select * from product order by qty;
select * from product order by price;
select * from (select * from product order by qty) as a order by a.price;
select max(price) from product;
select min(price) from product;
select sum(price) from product;
select avg(price) from product;
select *,price*qty as tt from product;
select sum(tt) from (select *,price*qty as tt from product) as a;
select year('1985-7-6') as birth;
select month('1985-7-6') as mon;
select now();
select year(now());
select second(now());
insert into product (name,price,qty)values(now(),7.8,90);
select * from product;
create table p(createtime defult now())
select trim("a b");
select floor(3.14);
select floor(-3.14);
select ceiling(9.8);
select ceiling(9.3);
select round(9.5);