代码拉取完成,页面将自动刷新
同步操作将从 ww381048089/第四阶段 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
在数据库服务器上安装图形软件
在数据服务器 192.168.4.51 安装图形工具软件phpmyadmin
让客户端可以使用如下路径访问
http://192.168.4.51/phpmyadmin
休息到 16 :05
user 表存储了 操作系统用户信息
/etc/passwd
行号 用户名 密码 uid gid 说明信息 家目录 shell
id | name| password | uid | gid | comment | homedir shell |
select * from tarena.user;
select name from tarena.user;
select id , name, shell from tarena.user;
select name from tarena.user;
select name from tarena.user where 条件表达式;
select name from tarena.user where id = 1 ;
条件表达式 的怎么写? 休息到 17:05
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
今天 只需要 host50 数据库服务器 host51可以关闭
搭建mysql数据库服务器
数据库管理员root密码管理
常用命令的使用
安装图形工具phpmyadmin
基本查询
语法格式
1 select 字段名列表 from 库名.表名 ;
2 select 字段名列表 from 库名.表名 where 条件表达式;
条件表达式
数值比较 = != > < >= <=
字符比较 = !=
空 is null
非空 is not null
范围匹配 in not in
between 数值1 and 数字2
select name from tarena.user where name like '__%__';
模糊匹配
正则匹配
逻辑比较
休息到 11:05
库 文件夹 存储文件
建库 为了 存放表
表 存储数据的文件
定义存储数据的表头
create table 库名.表名(表头名 数据类型 ,表头名 数据类型);
建表是 如何 决定 表里有几个表头 都怎么命名?
ER关系模型
休息到 16:05
insert into 插入 行
休息到 17:05
mysql数据类型
指定表头下存储的是那种类型的数据
电话号 字符
"11"
包括:
数值类型 工资 成绩 体重
整型 只能存储整数 2 2.23 1.88
浮点型 能存储带小数点的数据 2.23
float
double 3.1415926
字符类型 姓名 收货地址 家庭地址
30RMB
varchar
20
15 姓名 varchar(10)
张三三
日期时间类型 生日 注册时间 入职时间 出生那份
枚举类型 表头的值 只能在列举的范围内选项
爱好 性别 婚姻状况 民族
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
今天 实验使用host50主机
数据类型:数值类型 字符类型 日期时间类型
枚举类型
enum(值列表) 单选
set(值列表) 多选
表头的值必须在类型定义值的范围内选择
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
休息到 10:05
日期时间类型
注册时间 生日 上班时间 出生年份
年 日期 时间 日期时间
year date time datetime 或 timestamp
2022 20220107 103000 20221120203000
desc mysql.db;
~~~~~~~~~~~~~~~~~~~~~~~~~~
休息到 11:05
数据导入、导出
检索目录 : 存放数据的文件必须 存放在 mysql服务默认
要求的目录下
文件 --------- > 表
文件 <--------- 表
诉求:将/etc/passwd文件里行 导入 db1库的t3表里
RDBMS1_DAY03
1 字段约束
约束设置在表头上 用来控制如下向表头下存储数据
primary key 主键 的使用
使用规则? 创建主键 验证主键功能 删除主键
核心功能 :字段值不允许重复,且不允许赋NULL值
复合主键
PRI PRI
客户端地址 服务端口号 访问状态
cip port status
1.1.1.1 22 deny
1.1.1.1 80 allow
2.2.2.2 80 deny
2.2.2.2 3306 allow
休息到 16:05
foreign key 外键
auto_increment 自增长
让表头 通过自加1 的计算结果赋值
休息到 17:05
mysql> select * from db1.user;
alter table db1.user
add
id int primary key auto_increment first;
select * from db1.user;
select * from db1.user where id <= 10 ;
select * from db1.user where id = 10 ;
2 mysql索引
3 用户管理
把 tarena库eployees表的记录 导入到 db1库的employees
insert table db1.employee (select * from tarena.employee)
字段约束条件 : 设置在表中的表头上
作用:限制给表头赋值
有哪些约束:
是否允许赋null值 not null
设置默认值 default 值
唯一索引 unique
主键 primary key
RDBMS1_DAY03
外键 的 使用 :
使用规则 :
向有外键标签的表头下存储数据时,
必须在参考的表中指定表头的值范围内选择
作用 : 设置在表中的表头上,保证数据的一致性
外键的应用场景:
考虑的事情:(如何确保发工资的员工一定在公司里存在)
员工表 (记录公司员工信息)
ygtab
yg_id name
工号 姓名
8 tom
3 jerry
工资表 gztab
外键
gz_id pay
工号 工资
create table db1.ygtab(
yg_id int primary key auto_increment ,
name char(10)
)engine=innodb;
create table db1.gztab(
gz_id int , pay double ,
foreign key(gz_id) references ygtab(yg_id)
on update cascade on delete cascade
)engine=innodb;
创建外键
create table 库.表( 字段名列表,
foreign key(表头名) references 表名(表头名)
on update cascade on delete cascade
)engine=innodb; 存储引擎
查看外键
删除外键
添加外键
休息到 11:10
验证外键功能
mysql索引 的使用
1 什么是索引 ?
索引是设置在表中的表头上的,
作用是 给表头下存储的数据生成排队信息。
user 表 /var/lib/mysql/数据库/user.frm user.ibd
name表头 入职日期 成绩
NULL
TOM
TOM
select name from user where name = "张三";
insert delete update
新华字典 5000页
目录 1----800页
笔画
拼音 a
b 100-----500
c
部首
正文 801-----5000
汉字的解释更新 50 80
2 索引的优点与缺点 ?
3 索引的使用规则(需要记忆)
4 索引的 查看 创建 删除 添加 验证索引的优点
index 普通索引
unique
fulltext
mysql> show index from db1.tea4 ;
explain select 查询命令 ;
explain select * from db1.user where name="sshd";
create index xxx on db1.user(name);
drop index xxx on db1.user;
索引?
优点 缺点
索引的使用规则
创建 查看 添加 删除
用户授权 (2.5节课)
数据管理员连接服务后 添加普通用户 并设置访问权限和连接密码
grant select on db1.user to admin@"192.168.4.1"
identified by "123456" ;
grant all on wordpress.* to wordpress@"localhost"
identified by "wordpress";
grant all on wordpress.* to wordpress@"192.168.2.11"
identified by "wordpress";
练习到 15:45
练习完的 思考:
如何知道服务器上 已经添加了哪些用户
休息到 17:05
如何给已有的用户追加权限
怎么撤销用户的权限
grant
revoke 权限列表 on 库名 from 用户@"客户端地址";
revoke grant option on *.* from root@"%" ;
怎么把添加的用户删除
练习到 17:30
用户授权命令格式
grant 权限列表 on 库名 to 用户@”客户端地址"
identified by “密码” with grant option ;
撤销用户权限 revoke 权限列表 on 库名 from 用户@”客户端地址" ;
删除用户 drop user 用户@”客户端地址" ;
查看服务器已有的用户 select host , user from mysql.user;
查看已有用户的权限 show grants for 用户@”客户端地址" ;
给已有用户追加权限 (库名 用户名 客户端地址都不变就是追加权限)
grant 权限列表 on 库名 to 用户@”客户端地址" ;
修改已有授权的密码
set password for 用户@”客户端地址"=password("密码");
授权库mysql的使用 (存储的已有的用户和访问权限)
user 记录已经授权的 用户
select host , user from mysql.user;
db 记录授权用户对 库的访问权限
grant all on gamedb.* to adminONE@"%" identified by "123qqq...A" ;
select * from mysql.db;
tables_priv 记录授权用户对 表的访问权限
select * from mysql.tables_priv;
columns_priv 记录授权用户对 表头的访问权限
select * from mysql.columns_priv;
update(name)
09:上课
今天的实验 在 host50 主机 完成
RDBMS1_DAY04 (select) 查个够
查询的语法
函数 是mysql服务内置的命令
通常是
函数名称()
函数名称(参数)
有不同功能的函数 比如获取系统时间的函数
数据计算函数 字符处理 函数
可以使用select 命令输出函数的处理结果;
函数也可以单独使用
例如 获取操作系统的时间 select now();
可以使用函数对查找到的数据做处理
例如 统计解释器是/bin/bash的用户个数
select name from tarena.user where shell = "/bin/bash";
select count(name) from tarena.user
where shell = "/bin/bash";
mysql> select count(name) as 用户个数 from
tarena.user where shell = "/bin/bash";
mysql> select length("www.tedu.cn") ;
+-----------------------+
| length("www.tedu.cn") |
+-----------------------+
| 11 |
+-----------------------+
1 row in set (0.00 sec)
mysql>
mysql> select length(name) from tarena.user where name="sshd";
+--------------+
| length(name) |
+--------------+
| 4 |
+--------------+
1 row in set (0.00 sec)
mysql>
mysql> select length(shell) from tarena.user where name="sshd";
+---------------+
| length(shell) |
+---------------+
| 13 |
+---------------+
1 row in set (0.00 sec)
mysql>
数学函数
mysql> select mod(10,3) ; 类似于 echo $[10%3]
+-----------+
| mod(10,3) |
+-----------+
| 1 |
+-----------+
1 row in set (0.00 sec)
mysql> select pi();
+----------+
| pi() |
+----------+
| 3.141593 |
+----------+
1 row in set (0.00 sec)
mysql>
mysql> select name , mod(uid,2) from tarena.user where name="ftp";
mysql> select name , uid from tarena.user where mod(uid,2) = 0 ;
聚集函数(对数值类型表头的下的数据 做统计)
mysql> select sum(uid) from tarena.user;
mysql> select count(name) from tarena.user where shell != "/bin/bash";
+-------------+
| count(name) |
+-------------+
| 22 |
+-------------+
1 row in set (0.00 sec)
mysql> select count(*) from tarena.user;
+----------+
| count(*) |
+----------+
| 31 |
+----------+
1 row in set (0.00 sec)
mysql>
数学计算 + - * / % ()
符号两边 必须是 数字 或 数值类型的表头
mysql> select 2 + 3 * 5 / 4 % 3 as 计算结果;
+--------------+
| 计算结果 |
+--------------+
| 2.7500 |
+--------------+
1 row in set (0.00 sec)
在 tarena.user 表
的 name 表头下方添加 出生年份 表头 默认值是 1990 年
然后查询 sshd 用户的 年龄
alter table tarena.user
add
出生年份 year default 1990 after name ;
mysql> select name , 出生年份, 2022 - 出生年份 as 年龄
from tarena.user where name="sshd";
查询tarena.user 表 sshd 用户 和 ftp 用户的 uid 和 gid 号
然后把2个用户 uid 和 gid 的 和 输出
mysql> select uid , gid from tarena.user
where name in ("sshd","ftp");
mysql> select uid + gid from tarena.user
where name in ("sshd","ftp");
mysql> select sum(uid + gid) from tarena.user
where name in ("sshd","ftp");
日期时间函数 用来获取日期时间类型表头下的对应日期时间的
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 11:08:51 |
+-----------+
1 row in set (0.00 sec)
mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2022-01-11 |
+------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2022-01-11 11:09:09 |
+---------------------+
1 row in set (0.00 sec)
mysql>
mysql> select id , date from tarena.salary where id <= 10 ;
mysql> select year(date) from tarena.salary where id = 2 ;
mysql> select month(date) from tarena.salary where id = 2 ;
mysql> select day(date) from tarena.salary where id = 2 ;
mysql> select now() ;
mysql> select time( now() ) ;
if() 判断
select * ,
if(dept_name in ("运维部","开发部","测试部"),"技术部","非技术部")
as 部门类类型 from tarena.departments;
ifnull()
mysql> select name,shell from tarena.user;
mysql> select name,ifnull(shell,"No Shell") from tarena.user;
case 判断语句
mysql> select name,shell,
-> case shell
-> when "/bin/bash" then "yes login"
-> when "/sbin/nologin" then "no login"
-> else "other shell"
-> end as 登录类型
-> from tarena.user ;
判断条件的第2种写法
mysql> select * ,
-> case
-> when dept_name in ("运维部","开发部","测试部") then "技术部"
-> when dept_name in ("市场部","销售部") then "商务部"
-> when dept_name in ("人事部","财务部","法务部") then "行政部"
-> else "小卖部"
-> end as 部门类型
-> from tarena.departments;
1 基础查询进阶
字符函数 数学函数 日期时间函数 统计函数 数学计算
判断语句 if判断 和 case 判断
查询表中的数据时 可以对查找到的数据做判断 根据判断结果输出数据
select 字段名列表 from 库.表 where 条件;
查询结果处理: 对查找出来数据再做处理
select * from tarena.user ;
select * from tarena.user where id <= 10 ;
select name,shell from tarena.user where id <= 10 ;
select查询 [分组|排序|过滤|分页]
分组:在人类社会里 具有相同特征为一组,
在查找里一样的数据为一组
select查询 group by 表头名;
mysql> select shell from tarena.user group by shell;
mysql> select shell from tarena.user where uid < 1000 group by shell;
mysql> select count(name) ,shell from tarena.user where uid < 1000
group by shell;
排序
select查询 order by 表头名 排序方式;
注意 表头是数值类型的 排序才是有意义的
可以按照表头下存储数值的降序 或升序排序 默认是升序
desc 降序 asc 升序
mysql> select name , uid from tarena.user
where uid >=10 and uid <= 100
order by uid desc;
按员工编号1-10 的 总工资的和 升序排序
mysql> select employee_id , sum(basic) as zgz
from tarena.salary where employee_id <=10
group by employee_id order by zgz ;
过滤 : 在查找到的数据里 再找一遍数据
select查询 having 条件
select employee_id ,date, basic from tarena.salary
where basic >= 20000 and basic <= 30000 and year(date) = 2020
having employee_id = 88;
和下边的查询结果一样
但下边查询 时 是全表查询 逐行用条件判断
select employee_id ,date, basic from tarena.salary
where basic >= 20000 and basic <= 30000 and year(date) = 2020
and employee_id = 88;
分页
把符合查询条件的记录 限制显示的行数
默认一次性把符合条件的记录全都显示出来
select查询 limit 数字 ; #仅显示查询结果的头几行
select查询 limit 数字1,数字2 ;#只显示指定范围内的行
数字1 起始行 (表示从查询结果的哪行开始显示)
从第1行开始显示用户数字0表示
数字2 表示总行数 (表示共显示几行)
select employee_id,date,basic from tarena.salary
where year(date)=2018 and month(date)=12;
select employee_id,date,basic from tarena.salary
where year(date)=2018 and month(date)=12 limit 1 ;
select employee_id,date,basic from tarena.salary
where year(date)=2018 and month(date)=12 limit 3;
select name,uid from tarena.user where
uid between 10 and 100 order by uid desc limit 1;
select name,uid from tarena.user where
uid between 10 and 100 order by uid desc limit 3;
mysql> select name,uid,shell from tarena.user
where shell="/sbin/nologin";
mysql> select name,uid,shell from tarena.user
where shell="/sbin/nologin" limit 1,3; 从第2行开始显示共显示3行
+--------+------+---------------+
| name | uid | shell |
+--------+------+---------------+
| daemon | 2 | /sbin/nologin |
| adm | 3 | /sbin/nologin |
| lp | 4 | /sbin/nologin |
+--------+------+---------------+
3 rows in set (0.00 sec)
mysql> select name,uid,shell from tarena.user
where shell="/sbin/nologin" limit 2,3;
从查询结果的第3行开始显示共显示3行
select name,uid,gid,shell from user where uid >10
having shell ="/sbin/nologin" limit 1,3;
2 连接查询
为什么要学习? 不是用一张存储所有的数据信息
是把数据分类存储在不同的表。
不能从一张表把所有的数据信息找全
什么是连接查询:
把2张或2张以上的表 通过不同的连接方式 组成
一张临时的新表 然后在组成的新表里 查找符合条件的数据。
不同的连接方式: 内连接 外连接 交叉连接
内连接的使用: 分为 等值连接 非等值连接 自连接
等值连接 连接时 使用相等做判断条件
select 表名.字段名 from 表a inner join 表b
on 相同判断条件 where 筛选数据的条件
having 过滤条件 | group by 表头名 | order by 表头名 |
limit 数字 ;
笛卡尔积 两张表记录行数相乘的积 就查询结果的总行数
连接查询的种类(连接查询的语法格式)
mysql> select d.dept_name , e.*
from employees as e inner join departments as d
on e.dept_id=d.dept_id
limit 2;
mysql> select d.dept_name , e.*
from employees as e inner join departments as d
on e.dept_id=d.dept_id where d.dept_name="销售部";
mysql> select name,sum(basic+bonus)
from employees inner join salary
on employees.employee_id=salary.employee_id
where year(date)=2018 group by name;
mysql> select name,sum(basic+bonus) as total
from employees inner join salary
on employees.employee_id=salary.employee_id
where year(date)=2018
group by name
order by total desc
limit 1;
9:00 上课
今天的实验 在host50 主机 完成
打开第4天的笔记 RDBMS1_DAY04
RDBMS1_DAY04 剩下的
连接查询
内连接 中的等值连接
内连接 中的非等值连接 自连接
外连接 左/右连接
把没有员工的部门名显示出来
把没有部门的员工名显示出来
select d.* ,e.name
from
employees as e left join departments as d
on d.dept_id = e.dept_id
where d.dept_name is null;
或
select d.* ,e.name
from
departments as d right join employees as e
on d.dept_id = e.dept_id
where d.dept_name is null;
把 uid最小的用户信息 查询出来
把 uid最大的用户信息 查询出来
把 tarena .user 表里
uid最小的用户信息和 uid最大的用户信息
一起显示出来。
mysql> (select * from tarena.user order by uid desc limit 1 ) union (select * from tarena.user order by uid limit 1 );
嵌套查询 (形象比喻 俄罗斯套娃)
查询select命令里 包含 select 查询命令
外层的查询数据 在内层查询结果里查找
查询语句select 的命令格式
select 字段名列表 , from 表名 where select查询 条件 ;
查询运维部所有员工信息 employees
select * from employees where dept_name = "运维部" ;
查询部门员工人数 比 开发部人数少 的 部门
< 统计开发部门 的 人数
查询人事部和财务部员工信息
select * from employees
where
dept_id in (
select dept_id form departments
where dept_name in ("人事部","财务部")
);
查询人事部2018年12月所有员工工资
select * from salary where
year(date)=2018 and month(date)=12 and
employee_id in ( select employee_id from employees
where dept_id=(select dept_id from departments where dept_name='人事部') ) ;
查找2018年12月基本工资和奖金都是最高的工资信息
select * from salary where
where 条件 2018年12月 基本工资和 奖金都是最高
查询3号部门及其部门内 员工的编号、名字 和 email
部门编号 部门名称 员工的编号、名字 email
多表更新和 多表删除
RDBMS1_DAY04
单表查询
多表查询: 笛卡尔积 内连接 外连接 全连接
嵌套查询 查询命令里包含其他查询命令
把内层的查询结果作为外层查询的查询条件
多表修改 和 多表删除
RDBMS1_DAY05
mysql视图
什么是视图 只有表头的表 数据是存储在创建视图时
访问的原表里。
创建视图
查看当前库里 哪些是视图
视图里的数据是从那个表里获取的
删除视图 drop view
~~~~~~~~~~~~~~~~~~~~~~~
09:00 上课
今天的实验在host50 主机 完成
今天要完成的学习任务
在视图v2里可以看到 员工的 > 10000 且 < 20000 的 基本工资 信息
select * from v2 where employee_id = 99;
update v2 set basic=30000 where employee_id = 99;
select * from v2 where employee_id = 99;
select employee_id,basic from tarena.salary where employee_id = 99;
课间休息 到 10:05
视图进阶
mysql存储过程
mysql服务的脚本 可以把重复执行的sql命令 定义一个名称 保存到
数据库服务器上,调用定义的 名称 就可以反复的执行sql命令
存储过程 存储在服务器 库下的表里
存储过程的 基本使用 练习 15分钟到 11:48
创建 存储过程的命令格式
执行 call 库.存储过程名() ;
查看 (查看功能代码 和 存储过程是否存在)
删除 drop procedure 库.存储过程名 ;
存储进阶
变量
系统变量 :全局变量 会话变量
用户变量 :自定义变量 局部变量 begin .... end
传参
delimiter //
create procedure say1( in user_name char(10));
begin
select name into @x from tarena.user where name = user_name;
select @x ;
end //
delimiter ;
休息 到 16:10
call say1("root") ;
call say1("ftp");
call say1("bin");
(9)
where dept_id =9 ;
create procedure tarena.deptype_pro(IN no int, OUT dept_type varchar(5))
begin
declare type varchar(5);
select dept_name into type from departments where dept_id=no;
if type='运维部' then
set dept_type='技术部';
elseif type='开发部' then
set dept_type='技术部';
elseif type='测试部' then
set dept_type='技术部';
else
set dept_type='非技术部';
end if;
end //
判断语句 循环语句 循环控制语句 break coutinue
create procedure tarena.loop1()
begin
loop
declare i int default 1;
loop
select sleep(1) , i;
end loop;
end loop ;
end //
call tarena.loop1();
repeat
循环体
until 判断条件 1 = 1
end repeat;
call tarena.repeat_pro(4);
declare j int default 1;
repeat
set j=j+1; 5
insert into tarena.departments(dept_name) values('sales');
until j>i #判断条件不成立执行循环体,反之循环结束
end repeat;
call tarena.reptea_pro(4);
默认就有一次,然后 2 3 4 三次,5不执行直接跳出
while 1 = 2 do
select "aaa";
end while ;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
今天试验 依然在 50主机 完成 把51 主机也启用
存储过程里的
循环控制语句 的功能 在循环条件满足的情况下
结束循环 leave (break)
跳过某次循环并开始下次循环 iterate (continue)
名称:loop
循环体;
leave 给循环结构定义的名称;
end loop 名称;
delimiter //
create procedure tarena.p1()
begin
declare j int default 1 ;
w:while j <= 3 do
if j = 2 then
set j = j + 1;
iterate w;
end if;
select j ;
set j = j + 1 ;
end while w ;
end //
delimiter ;
call tarena.p1() ;
RDBMS1_DAY05 1 mysql视图 mysql存储过程
RDBMS1_DAY06 数据的备份与恢复
相关概念?
备份操作 都在 50 进行
练习数据恢复 50主机可以使用 自己的备份文件恢复数据
51 主机也可以使用 50 的备份文件恢复数据
周四
周五 增量备份
周六 增量备份
周一 完全备份
周二 差异备份
周三 差异备份
周四 差异备份
工作中使用的备份策略
周一 完全备份
00 23 * * 1 实现对数据做完全备份的脚本( shell python)
周二到周日备份新产生的数据
00 22 * * 2-0 实现对数据新数据做备份的脚本( shell python)
数据的物理备份与恢复
mysqldump -uroot -p123456 -B tarena > /bakdir/tarena_`date +%F`.sql
时时 | (实时) 备份数据
启用mysql服务的binlog日志文件 实现对数据的 实时备份 。
1 binlog日志的使用
只要把日志启用就实现了对数据的实时备份
日志 :就服务日记
binlog日志 错误日志(默认启用 ) 查询日志 慢查询日志
启用binlog日志文件
自定义日志文件存放的目录 和 文件名
创建新的日志文件
日志管理命令的使用
休息到 15:05
2 使用binlog日志文件恢复数据
2.1 格式1 适用于记录的都是对数据做insert 和 update 命令
执行文件记录的所有命令恢复数据
]# mysqlbinlog /目录/文件名 | mysql -uroot -p密码
练习使用 格式1 恢复数据
笔记的 268 行 ( 日志文件名 和 root密码 要写自己机器的)
练习到 15:45
格式2 适用 记录了的对数据做delete 命令
执行指定范围记录的命令恢复数据
]# mysqlbinlog 选项 /目录/文件名 | mysql -uroot -p密码
mysqlbinlog --start-position=328 --stop-positon=810 /root/plj.000004 |
mysql -uroot -pNSD2021...a
mysqlbinlog --start-datetime="2022/01/14 16:28:13"
--stop-datetime="2022/01/14 16:36:40" /root/plj.000004 |
mysql -uroot -pNSD2021...a
mysqlbinlog --start-position=2252 /root/plj.000004 |
mysql -uroot -pNSD2021...a
修改binlog日志文件记录命令的格式
mysql> show variables like "%binlog%";
mysql> show variables like "binlog_format";
行模式 报表模式 混合模式
ROW statement MIXED
练习 完后 休息到 17:05
演示 格式2 恢复数据
物理备份
mysqldump
备份数据和恢复数据期间都锁表 (并且加的是写锁)
会禁止对表做 select 和 insert 访问
使用binlog 恢复数据
物理备份与恢复
mysqldum 实现对数据完全备份与恢复 及优点与缺点
binlog日志文件的使用
使用日志文件恢复数据
mysqlbinlog [选项] /目录/文件名 | mysql -uroot -p密码
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
环境准备:
在host50 和 host51 主机 分别安装软件
]#yum -y install libev-4.15-1.el6.rf.x86_64.rpm
]#yum -y install percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
要完成的学习任务:
RDBMS1_DAY06 剩下的 innobackupex 备份与恢复
innobackupex 特点 在线热备不锁表
备份的练习在 host50 操作者
恢复练习 在 host51 操作
使用innobackupex备份文件恢复数据,要求数据库目录必须是空目录
innobackupex可以对数据做完全备份 与恢复
备份命令格式
恢复数据命令格式
恢复数据的步骤
使用 innobackupex完全备份文件 仅恢复1张表的所有数据
练习 + 休息到 11:15
delete from tarena.user;
drop tabel tarena.user;
mysqldump
host50
innobackupex可以对数据做增量备份 与恢复
增量备份的定义 :备份上次备份后,新产生的数据
A 周一 完全备份 A
A+B 周二 增量备份 B
A+B+C 周三 C
A+B+C+D 周四 D
首次完全备份
[root@host50 ~]# innobackupex -uroot -p123456 /fullbak --no-timestamp
完全备份后向表里存储新数据
mysql> insert into tarena.user(name,uid) values("a",1); 多存几行
增量数据
[root@host50 ~]# innobackupex -uroot -p123456 --incremental /new1dir
--incremental-basedir=/fullbak --no-timestamp
执行差异备份
[root@host50 ~]# innobackupex -uroot -p123456 --incremental /new1dir
--incremental-basedir=/fullbak --no-timestamp
向表里存储新数据
mysql> insert into tarena.user(name,uid) values("b",2); 多存几行
增量数据
[root@host50 ~]# innobackupex -uroot -p123456 --incremental /new2dir
--incremental-basedir=/new1dir --no-timestamp
差异备份
[root@host50 ~]# innobackupex -uroot -p123456 --incremental /new2dir
--incremental-basedir=/fullbak --no-timestamp
向表里存储新数据
mysql> insert into tarena.user(name,uid) values("c",2); 多存几行
增量备份
[root@host50 ~]# innobackupex -uroot -p123456 --incremental /new3dir
--incremental-basedir=/new2dir --no-timestamp
差异备份
[root@host50 ~]# innobackupex -uroot -p123456 --incremental /new3dir
--incremental-basedir=/fullbak --no-timestamp
增量恢复数据命令格式 (要求数据库目录下没有数据)
1 准备恢复数据
2 合并数据
3 拷贝数据
428 systemctl stop mysqld
430 rm -rf /var/lib/mysql/*
432 innobackupex --apply-log --redo-only /root/fullbak/
434 innobackupex --apply-log --redo-only /root/fullbak/
--incremental-dir=/root/new1dir
435 innobackupex --apply-log --redo-only /root/fullbak/
--incremental-dir=/root/new2dir
437 innobackupex --apply-log --redo-only /root/fullbak/
--incremental-dir=/root/new3dir
439 rm -rf /root/new*
440 innobackupex --copy-back /root/fullbak/
443 chown -R mysql:mysql /var/lib/mysql
444 systemctl start mysqld
445 mysql -uroot -p123456
innobackupex可以对数据做差异备份 与恢复
50 51 52 53 54 55
RDBMS2_DAY01 mysql主从同步
相关概念?
mysql主从同步介绍?
存储数据的服务结构
有2种角色的数据库服务器
主数据库服务器 (master)
从数据库服务器 (slave)
主从同步的工作原理:
1 启用binlog日志文件 2 用户授权 3查看日志信息
主服务器配置步骤:
1 必须指定server_id 并重启数据库服务器
2 确保与主数据库服务器数据一致
3 指定主服务器信息
4 启动slave进程
5 查看进程状态
测试配置
主从同步结构?
一主一从 把 52 配置为 51 的从数据库服务器
配置主服务器 51
配置从服务器52
休息+练习到 16:15
测试配置
stop slave;
chanage master to 。。。。。 ;
start slave;
show slave status \G
Last_IO_Error: error reconnecting to master 'repluser3@192.168.4.51:3306' - retry-time: 60 retries: 1
一主多从 51 52 53
主从从 53(主) 54(从) 55(从)
主主结构
从服务器配置步骤:
50 (客户端) 51 - 55 123qqq...A
今天使用用到的虚拟机
准备数据服务器 53 54 55 68 69
启动mysqld服务 管理员root 可以登录 密码123qqq...A
50 56 57 51 和 52 可以暂时 关闭
配置主主结构 15 分钟 到 11:45
笔记的323 行 开始
今天要完成的学习任务:
主从从 主主结构
一主一从 一主多从
mysql主从复制模式
主从服务器之间实现数据同步的工作模式
异步复制模式 (默认模式)
半同步复制模式 (host50) 练习10分钟 到 14:23
把当前的数据库服务器都删除51 - 55 68 69
RDBMS2_DAY02 mysql数据读写分离 和 mysql 多实例
配置mysql 一主一从同步结构 时间10分钟到 14:50
准备3台新的数据库服务器 ip地址
192.168.4.51 192.168.4.52 192.168.4.57(关闭数据库服务)
mysql中间件 架设在数据库和客户端之间的服务软件 统称中间件
有多种中间件功能软件
实现mysql数据读写分离功能的中间件软件界
mysql-proxy mycat maxscale
装包 修改配置文件 启动服务 查看服务状态
测试配置 + 休息到 17:05
mysql多实例 :
在一台 物理服务器上 运行多个 数据库服务
mysql-5.7.17
网站服务的虚拟主机
192.168.4.57
ss -utnlp | grep 3307 [mysqld1]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
休息到 10:00 讲 RDBMS2_DAY03 mysql分库分表
抖音 得有上亿个账号
注册的账号信息存储在 数据库服务器
会把所有的注册账号存1张表里吗?
A 10W B 10W C 10W
30行记录
5 -----> A
5-------> B
5--------> C
D
E
F
银行 的业务
存款 信用卡 贷款 理财业务
a b c d
创建新库 新表
RDBMS2_DAY04 MHA集群 (把集群环境准备好 )
~~~~~~~~~~~
16:15 之前 做 mycat 分片规则练习和 准备MHA集群环境 (不需要做第3步)
~~~~~~~~~~~
RDBMS2_DAY05 PXC集群 和 mysql存储引擎
insert into 库.表(字段名列表) values (值列表) ;
db1.user 查看user 使用的分片规则
然后根据分片规则计算结果 存储数据
A ------ > 反馈给 分片服务器-----> 客户端
B
C
定义数据分片存储的表:schema.xml
dn1 dn2 dn3 dn4
53 54 55
定义表使用的的分片规则 、
及向那些表里存储数据时
要把数据分别存储在数据库服务器 53 54 55
今天要完成的学习任务
RDBMS2_DAY04 MHA mysql高可用集群
集群知识回顾:
什么是集群? 集群的好处是什么?
集群的分类? 负载均衡集群 高可用集群 高性能集群
负载均衡集群是怎么工作的?
高可用集群是怎么工作的?主备模式 vip地址
负载均衡集群软件 haproxy nginx lvs
高可用集群软件 keepalvied
shell python perl ruby lua
mysql -hvip -u用户名 -p密码 主从
vip
数据服务器1 数据库服务器2
优先级150 优先级 100
mysql从 mysql主
keepalvied
insert into fff
select * from
insert into aaa
bbb
步骤一 :集群环境准备
1 所有数据库服务器的公共配置
2 ssh 密码登录配置
2.1 所有数据库服务器之间免密登录
2.2 管理主机免密登录所有数据库服务器
3 配置mysql 一主 多从
3.1 配置主数据库服务器 51
3.2 配置从数据库服务器
3.2.1 配置主机 52
3.2.2 配置主机 53
配置好后休息到 11:05
步骤二:配置管理主机 192.168.4.57
1 安装软件
1.1 安装依赖软件
1.2 安装MHA_MANAGER
5分钟 到 11:20
2 创建主配置文件并编辑
创建工作目录
使用模板文件创建主配置文件
根据环境准备 编辑文件
3 创建故障切换脚本 并制指定vip地址
步骤三: 配置数据库服务器
1 安装mha_node软件 (51 53 52 )
2 创建监控用户
3 在当前主从结构中的主服务器51 上配置vip 地址
3分钟完成 配置数据库服务器的配置
到 14:14
步骤四:测试配置
1 测试 ssh 免密登录配置
2 测试一主多从的配置
休息到 15:07
masterha_check_repl --conf=/etc/mha/app1.conf
步骤五: 启动管理服务
57
步骤六:测试集群
测试+ 休息到 16:15
步骤七:把宕机的主服务器再次添加到集群里
练习到 16:50
MHA集群的配置步骤:
准备服务器至少3台
环境准备: ssh 主从 公共配置
配置管理主机:安装mha_manager软件
编辑app1.cnf文件
创建故障切换脚本并设置vip地址
配置数据服务器:
创建监控用户
安装mha_node软件
把vip 地址部署在主从结构中的master服务器上
测试配置:
免密登录 主从同步
启动管理服务 查看服务状态 停止管理服务
测试配置 测试高可用功能
测试的结果:任何时刻 都可以连接vip 地址
访问数据库服务 查询数据和存储数据
把宕机的数据库服务器再添加到集群里
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
今天上课需要的环境:
ip地址 主机名
192.168.4.71 pxc71
192.168.4.72 pxc72
192.168.4.73 pxc73
完成的学习任务:
RDBMS2_DAY05 pxc集群 和 mysql存储引擎
修改配置文件 mysqld.cnf wsrep.cnf
在任意1台数据服务器上做集群初始化 (只需要做一遍)
在另外2台数据库服务器上启动mysql服务即可
wsrep.cnf
注意pxc软件内置的数据库服务名叫mysql
休息到 11:05
事务
select * from 库.表;
insert into 库.表 values ();
NoSQL_day01 (第3门课的第1天) 第一个知识点
NoSQL_day02
查看数据库服务默认使用的存储引擎
show engines;
修改数据库服务默认使用的存储引擎
常用存储引擎的特点
myisam存储引擎的特点
存储数据的方式 1个表对应3个表文件 .frm .MYI .MYD
innodb存储引擎的特点
存储数据的方式 1个表对应2个表文件 .frm .ibd
加锁的目的 数据库服务为了客户端的并发访问冲突问题
update db5.user set name="a" where id =1;
update db5.user set name="b" where id =2;
锁粒度 加锁的范围
myisam 表级锁 给整张表加锁 而不是锁被访问的行
INNODB 行级锁只给被访问的行分别加锁
锁类型 根据用户访问数据的操作命令区分的
如果 执行的是 select 加的读锁
加了读锁的表 只允许同时对表执行 select 访问
只有读锁释放后 才允许处理对表的写操作
insert update delete
读锁被称为共享锁
如果 执行的是 insert update delete 加的写锁
加了写锁的表, 在写锁没有释放之前 是不允许对
执行任何访问。
查询select 访问多的表 适合使用 哪种存储引擎? 适合使用myisam存储引擎
写访问多的表适合使用innodb存储引擎,为什么呢?并发访问量
1 ----》 mysql> ......... exit
事务日志文件
休息到 17:05
DBA
RDBMS1 RDBMS2
数据存储架构的搭建
mysql 数据库服务软件的使用
关系型数据库服务软件
建库 建表 (表头 数据类型 约束条件)
NOSQL 非关系型数据库服务统称 Redis
连接 50 的redis服务
查看 已经存储的数据
今天要完成的学习任务
连接redis 服务
]# redis-cli -h 127.0.0.1 -p 6379
或
]# redis-cli
127.0.0.1:6379> 常用命令的使用
查看已经存储数据 keys *
存储数据 set 变量名 值
查看变量的数据 get 变量名
断开连接 exit
休息一下到 10:00
/etc/redis/6379.conf 配置文件说明
掌握Redis支持的内存清除策略及相关的配置项
LNP+Redis 把网站的数据存储在redis服务器里
守护进程方式运行服务(常驻部队): 服务启动后 对应的进程一在服务器的
内存里运行着 等待客户来连接
非守护进程方式运行服务(机动部队):服务启动后 若在一段时间内
没有接收到客户端的连接, 进程就休眠 等有客户端连接时
再苏醒 继续提供服务。
内存清除策略:当向内存里存储数据时,内存空间不足 无法
存储当前要保存的数据,会自动调用定义的策略 把内存里
已经存储的数据删除,删除到 能存储下前要存储的数据为止。
内存清除策略: 是软件开发者编写好的数据删除程序,
我们只需要在服务的配置文件里 指定是要的删除策略即可
休息到 11:05
NoSQL—day02 部署Redis集群 及 管理集群
集群可以解决的问题
1 服务的高可用
2 数据自动备份
3 实现数据分布式存储
准备 6台redis服务搭建集群 51 - 56
时间到 16:15 上课
管理主机 :管理集群的集群 57
物理接口 eth0 192.168.4.51
客户端 50
准备集群环境
创建集群
命令格式
redis-trib.rb create --replicas 数字 redis服务器列表
redis-trib.rb create --replicas 1
192.168.4.51:6379 192.168.4.52:6739 192.168.4.53:6739
192.168.4.54:6379 192.168.4.55:6379 192.168.4.56:6379
数字 每台主数据库服务器 从服务器的台数
连接集群中的任意主机的ip 都可以访问集群存储数据
redis-cli -c -h 192.168.4.52 -p 6379
测试集群功能
测试高可用功能
数据自动备份功能
分布式存储数据的功能
集群分布式存储的工作原理
hash槽 实现数据的 分布式存储
休息一下 到 10:05
管理集群
添加redis 服务器到集群里
添加master 角色服务器
在什么情况下 需要向集群里添加 master 角色 数据库服务器 ?
步骤如下:
运行redis 服务且启用了集群功能
在管理主机 添加服务到集群里(master)
在管理主机 新添加的 master 服务器分配hash slots
添加slave 角色服务器
命令格式 (slave)
redis-trib.rb add-node --slave 新服务器的ip:port 已有服务器的ip:port
创建2台新虚拟机 ip 地址 是 192.168.4.58
运行redis 服务 并启用了集群功能
休息到 11:10
从集群里删除redis 服务器
删除master 角色服务器
删除slave 角色服务器
可以直接移除集群
命令格式
Redis-trib.rb del-node ip:port 被移除主机的ID
[root@host57 ~]# redis-trib.rb check 192.168.4.51:6379 | grep 192.168.4.56
S: 10f7deacb933cb659977d0c353c20c3a81050361 192.168.4.56:6379
[root@host57 ~]# redis-trib.rb del-node 192.168.4.51:6379 10f7deacb933cb659977d0c353c20c3a81050361
下午 要完成的学习任务
准备实验使用的虚拟机
NoSQL_day03
1 redis服务主从复制 (和mysql服务的主从同步结构一样)
带验证的主从复制
18:00 下课之前 准备 数据库项目day01 用的虚拟机
到 18:00 自行下课
nohup redis-sentinel /etc/sentinel.conf 2> /dev/null &
09:00上课
今天 54 55 56 Redis服务器做实验
2 持久化 支持数据永久存储
实现的方式有2 种
RDB 数据库目录下的 dump.rdb 文件
AOF 是文件 类似于mysql服务的binlog日志文件
AOF 相关配置
3 数据类型
pyhton 数据类型
整型 浮点型 字符类型 集合类型
元组( ) 列表 [ ] 字典{}
mysql 数据类型
字符类型 数值类型 日期时间 枚举类型
set mset
get mget
Redis 数据类型
字符类型 列表类型List Hash类型
集合: 有序集合 无序集合
每种类型都有对应的管理命令
对每种类型的数据做管理包括
查看变量存储的数据 修改 删除
旅游文章 100 美食文章 200 it技术文章 0
休息到 16:15
setbit 使用 二进制数 给变量赋值 目的是节省内存存储空间
0
1
1kb 是多少位
计算机存储进制单位
1T 1G 1M 1K 1字节 = 8位 1位
1024G 1024M 1024k 1024字节 0|1
1k能存多少位
365
setbit nb 1 1
setbit nb 2 1
setbit nb 365 0
nb=365
人民币的进制单位
11分钱 = 1角钱 1元钱 10元钱 100元钱
10角钱 =1元钱
10
project2_day01 1/2
hset 变量名 第1个前任
数据项目的的目的:
给项目1的网站服务 ,搭建数据存储架构,实现的功能:
数据库服务的高可用
数据的自动备份
数据库服务的负载均衡
搭建内存存储数据库服务器,
用来存储网站的热点数据,加快
网站的访问速度。
~~~~~~~~~~~~~~~~~~~~~~~~
09:00 上课
!!!!检查 昨天部署 的从服务器 22 的 状态 是否正常
grant select on mysql.*
[root@NFS30 ~]# lsblk 分区前查看
[root@NFS30 ~]# fdisk /dev/vdb -> n -> p -> 三个回车-> w
[root@NFS30 ~]# lsblk 分区后查看
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 30G 0 disk
└─vda1 253:1 0 30G 0 part /
vdb 253:16 0 3G 0 disk
└─vdb1 253:17 0 3G 0 part
[root@NFS30 ~]# mkfs.xfs /dev/vdb1
[root@NFS30 ~]# mkdir /sitedir
[root@NFS30 ~]# vim /etc/fstab
/dev/vdb1 /sitedir xfs defaults 0 0
:wq
[root@NFS30 ~]# mount -a
[root@NFS30 ~]# mount | grep -i "/sitedir"
/dev/vdb1 on /sitedir type xfs (rw,relatime,attr2,inode64,noquota)
[root@NFS30 ~]#
[root@NFS30 ~]# yum -y install nfs-utils rpcbind
[root@NFS30 ~]# vim /etc/exports
/sitedir *(rw)
:wq
[root@NFS30 ~]# chmod o+w /sitedir/
[root@NFS30 ~]# systemctl restart rpcbind
[root@NFS30 ~]# systemctl enable rpcbind
[root@NFS30 ~]# systemctl restart nfs
[root@NFS30 ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@NFS30 ~]# showmount -e localhost
Export list for localhost:
/sitedir *
[root@NFS30 ~]#
准备创建集群的6台redis 服务器 时间到 16:05
18:00 之前 不再讲课
自己复习实验 或准备 明天的虚拟机
黄色的虚拟机都可以删除了
一 MySQL数据在线迁移
在不停下线上服务器的数据库服务的情况下,把存储的数据复制
到其他存储架构里
第一天 搭建的是MySQL读写分离结构存储数据
缺点 MySQL服务有单点故障 无法实现MySQL服务的高可用 和
MySQL服务负载均衡
所以要在不停止服务的情况下 把 存放在读写分离架构
里的数据 复制到 pxc集群里
同时还有实现mysql服务的负载均衡和高可用
11:40 配置第二台 pxc服务器
添加 后 2台机器 到机器 没成功的同学 按照如下步骤排除: 15分钟 到 13:41
killall -9 mysqld (多执行几遍)
rm -rf /var/lib/mysql/*
检查 配置文件 写对了没 检查3台主机 防火墙 selinux 关闭了吗
66主机 要授权了 sstuser 用户
执行启动mysql服务
show status like "%wsrep%";
配置高可用集群 练习 + 休息到 15:45
二 、mysql服务的负载均衡和高可用
DBA 15K 数据库服务的优化
安装 数据的管理 数据库备份和恢复
主从同步 数据的分布式存储 数据的写分离
Oracle MongoDB 、 SQL SERVER 、 DB2 MySQL redis
把第五阶段环境准备.doc文档下载
根据 文档内容准备学习环境和 软件包
没有问题 就可以 放年假了
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。