一.数据库的备份
1.物理备份:直接复制数据库文件
2.逻辑备份:备份所有执行的sql语句
备份语法: mysqldump -h 服务器 -u 用户名 -p密码 数据库名 > 备份文件.sql
关键参数:
1.-B指定多个库,增加建库语句和use 语句,恢复的时候自动建库.
2.-A或者--all-databases
例如:C:\WINDOWS\system32>mysqldump -u root -p密码 -B -A> f:\数据库备份练习\all.sql恢复语法:mysql -h 服务器 -u 用户名 -p密码 数据库名 < 备份文件.sql
3.导出表
二.创建用户,指定权限
1.创建用户
create user "用户名"@"ip地址" identified by "密码";
2.删除用户
drop user "用户名"@"ip地址" ;
3.修改用户
rename user "用户名"@"ip地址" to "新用户名"@"ip地址";
4.修改密码
set password for "用户名"@"ip地址" = password("新密码");
5.用户授权
grant 操作(insert,select等) on 库名[.表名] to "用户名"@"ip地址";
grant all privileges on 库名[.表名] to "用户名"@"ip地址";
6.撤销授权
revoke all on 库名[.表名] from "用户名"@"ip地址";
三.视图
1.创建视图
create view 视图名 as sql语句;
2.使用视图
视图就是一张根据as后面的sql语句新建的表,跟表的操作一样,但是修改视图数据,真实的数据也会被修改.
3.删除视图
drop view 视图名;
四.触发器(new表示即将插入的数据行,old表示即将删除的数据行)
1.创建触发器
create trigger 触发器名 before/after insert/update/delete on 表名 for each row
delimiter // # 临时修改结束符create trigger tri_after_insert_cmd after insert on cmd for each row begin if new.success = 'no' then # 如果 ...然后....INSERT INTO errlog(err_cmd, err_time) VALUES(NEW.cmd, NEW.sub_time) ; END IF ; # 结束if语句END// #只有遇到//这个完成的sql才算结束delimiter ; #然后将mysql的结束符改回为分号
2.使用触发器
触发器是定制对某张表的数据进行操作时前后的行为,达到一定条件就会触发的操作.
3.删除触发器
drop trigger 触发器名;
五.储存过程
1.创建存储过程(无参)
delimiter //
create procedure 过程名()
begin
sql语法;
end //
delimiter ;
delimiter //create procedure p1()BEGIN select * from blog; INSERT into blog(name,sub_time) values("xxx",now());END //delimiter ;
2.创建存储过程(有参)
in 仅用于传参
out 仅用于返回值
inout 传参和返回值都可以
delimiter //create procedure p2( in n1 int, #n1参数是需要传入的,也就是接收外部数据的,并且这个数据必须是int类型 in n2 int)BEGIN select * from blog where id > n1; #直接应用变量END //delimiter ;
3.存储过程的调用
在mysql中调用:
call 过程名()
call 过程名(值1,值2)
#查看存储过程的一些信息:show create procedure p3; #查看视图啊、触发器啊都这么看,还可以用\G,show create procedure p3\G;\G的意思是你直接查看表结构可能横向上显示不完,\G是让表给你竖向显示,一row是一行的字段delimiter //create procedure p3( in n1 int, out res int)BEGIN select * from blog where id > n1; set res = 1; #我在这里设置一个res=1,如果上面的所有sql语句全部正常执行了,那么这一句肯定也就执行了,那么此时res=1,如果我最开始传入的时候,给res的值设置的是0,#那么你想,最后我接收到的返回值如果是0,那么说明你中间肯定有一些sql语句执行失败了#注意写法:out的那个参数,可以用set来设置,set设置之后表示这个res可以作为返回值,并且不需要像python一样写一个return,你直接set之后的值,就是这个存储过程的返回值END //delimiter ;#在mysql中调用set @res=0; #这是MySQL中定义变量名的固定写法(set @变量名=值),可以自己规定好,0代表假(执行失败),1代表真(执行成功),如果这个被改为1了,说明存储过程中的sql语句执行成功了call p3(3,@res);#注意:不要这样写:call p3(3,1),这样out的参数值你写死了,没法确定后面这个1是不是成功了,也就是说随后这个out的值可能改成0了,也就是失败了,但是这样你就判断不了了,你后面查看的这个res就成1了,所以这个参数应该是一个变量名昂,定义变量名就是上一句,如果你直接传一个常量数字,会报错的,写法不对。select @res; #看一下这个结果,就知道这些sql语句是不是执行成功了,大家明白了吗~~~#在python中基于pymysql调用,在python中只需要知道存储过程的名字就行了cursor.callproc('p3',(3,0)) #0相当于set @res=0,为什么这里这个out参数可以写常数0啊,因为你用的pymysql,人家会帮你搞定,pymysql其实会帮你写成这样:第一个参数变量名:@_p3_0=3,第二个:@_p3_1=0,也就是pymysql会自动帮你对应上一个变量名,pymysql只是想让你写的时候更方便#沿着网络将存储过程名和参数发给了mysql服务端,比咱们发一堆的sql语句肯定要快对了,mysql帮你调用存储过程print(cursor.fetchall()) #查询select的查询结果cursor.execute('select @_p3_0,@_p3_1;') #@_p3_0代表第一个参数,@_p3_1代表第二个参数,即返回值print(cursor.fetchall())#别忘了关掉:cursor.close()conn.close()#注意昂:存储过程在哪个库里面建的,就只能在哪个库里面用
在pymysql
cursor.callproc("过程名")
cursor.callproc("过程名",(值1,值2))
4.删除存储过程
drop procedure 过程名;
六.事务
1.事务的四大特性
原子性 一致性 隔离性 持久性
2.创建事务
start transaction;
sql语句1;
sql语句2;
rollback; # 回滚,回滚到初识状态
commit; #提交,一旦提交九永久保存
3.配合存储过程的事务使用
declare exit handler for sqlexception 声明 遇到错误就执行begin和end中的sql语句
begin
end
delimiter //create PROCEDURE p5()BEGIN DECLARE exit handler for sqlexception BEGIN rollback; END;START TRANSACTION; update user set balance=900 where name='wsb'; #买支付100元update user set balance=1010 where name='chao'; #中介拿走10元#update user2 set balance=1090 where name='ysb'; #卖家拿到90元update user set balance=1090 where name='ysb'; #卖家拿到90元COMMIT;END //delimiter ;
七.数据库集群
就是利用多台数据库服务器,构成一个虚拟的单一的数据库,向客户端提供数据服务
八.数据库读写分离
为了确保数据库产品的稳定,很多数据库拥有双机热备功能,也就是第一台数据库服务器提供增删改业务,第二台数据库服务器主要进行读的操作.
九.主从复制
用来建立一个和主数据库完全一样的数据库,主数据库服务器出现故障后,可以切换到从数据库继续操作
十.高可用
在有限的故障条件下,提供一定级别的稳定服务.
常见的 heartbeat + drbd
keepalive + lvs
ks8 + docker