mysql高级(视图事务索引搭建主从架构)

mysql客户端的清屏用ctrl L

用python连接mysql操作curd是最常用的,但有些特殊的业务场景应该搞点mysql高级。
我用docker跑的mysql,你要是用docker跑,不要跑最新版,最新版问题很多,跑这个版本,跑的时候用id跑就好了。

docker run -id --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=你的密码 841
在这里插入图片描述
-e MYSQL_ROOT_PASSWORD是为这个数据库设置root用户的密码,必须设置个密码,要不然跑不起的,因为没密码的话别人只需知道你ip端口,直接以root干进去,给你删库了咋办。还有,不要生死用root连mysql服务器,下面会介绍root进去怎样创建普通用户,以后用普通用户连接即可,root专门用来登入进行创建普通用户或权限分配操作,不用作数据库连接用户。

一、视图

客户端中,create view 视图名 as sql查询语句 ,创建一个视图,记住是查询语句

mysql高级(视图事务索引搭建主从架构)_第1张图片
试图的作用是,保存某条sql语句查询到的结果到一个视图表,视图表v_user会随跟它有关的数据变化而变化,v_user表在连接工具软件里面的视图项,它不是物理表,而是个虚拟表,删除要用drop view v_user;

视图的作用

a、复用一条sql查询语句,把select * from user 的结果 封装到了 v_user这个视图里。为了理解我上图是创建的一个单表查询命令视图,真正应用时不会去创这么简单的sql语句视图,是把一条有好几行的sql联表查询命令的结果创建为一个视图,要是我还想用这个结果,直接select xxx from v_user,就不用from 后面再跟前面那几行联表查询sql语句。

b、对数据库重构,却不影响程序的运行。你只要给一个查询结果生成了视图,我外部直接查视图即可。相当于视图已经帮我实时查询好结果了,我直接取,至于后端变了之后视图怎样去更新的自己的数据我不用管,我只跟视图打交道。

二、事务

为什么要有事务?

专门用来应对高并发的系统。如双十一减库存和下单,你不能减了库存客户还没下单吧,还有银行的转账,你不能只扣转账者不把钱给收款人吧。一句话,只要是需要完成多个sql操作(增删改)要么都成功执行,要么都不成功执行的需求,就可以把希望同时成功的操作绑定为一个事务。

事务的四大特性:(简称ACID)(面试)

原子性:意思就是一个事务不可能再被分了,无论事务里包含有多少个sql操作,事务就看成一件事,这件事要么成功要么失败。

一致性:事务中只有一个结果,要么全成功commit,要么全失败rollback,只要该事务里有一个sql操作异常,该事务里的所有sql操作,包括之前执行成功的,全部回滚。

隔离性
mysql高级(视图事务索引搭建主从架构)_第2张图片
看上图1~3:在左边开启事务后,commit或rollback之前,外界看不到左边做的修改,这就是隔离性。

再看4介绍个事务锁:只要左边开启了事务后操作了某表的id=3的那行数据,马上mysql会把刚刚操作的这一行锁住,而在左边完成事务之前,右边去修改这行,直接进去等待状态。必须等左边完成了事务,右边才能动id=3的数据(这就是innodb存储引擎的亮点,除支持事务外,还支持行锁。)

持久性:好理解,即某个事务完成(commit或roolback)后,事务中的所有数据库操作更新至库,rollback也可能还有操作更新至库,因为事务还有个保存点概念,即不完全回滚。但是我觉得这有点违背事务一致性原则。

mysql默认是开启事务的,这个commit是不是在python使用cursor操作数据库时用过,其实用pymysql连mysql时,只要你不用conn来commit,随便你execute里放啥都不会执行到库。那为啥我在客户端敲的sql不commit就能生效,因为在客户端,每句sql代码mysql都会帮你commit一次,但你要是主动begin,mysql就不帮你需要自己手动commit或者rollback。

除了测试没人会在mysql客户端使用事务,所以,更关键的是django中怎样使用mysql事务
下图我随便写了个get接口,调用django封装好的方法使用事务,里面有这些方法:开启事务,创建一个或多个保存点,回滚到保存点,提交到保存点。
mysql高级(视图事务索引搭建主从架构)_第3张图片
三、索引

问题产生:
当数据库中数据量很大时,查找数据会变得很慢,而数据库最多的操作就是查,所以常用数据会用redis来存,但并非所有数据都用redis,为了提升mysql查询速度,mysql索引就产生了,用来加速查找数据。

比如考试成绩张贴出墙了,你去找你自己的时候,你姓花,那你肯定每行都只看第一个字,那这个就叫索引。

mysql高级(视图事务索引搭建主从架构)_第4张图片
drop index 索引名 on 表名 (删索引)
show index from 表名 (查一个表的索引)

注意:
建索引还有很多种,这里只介绍常用的为某个字段建立索引。索引会让其他操作变慢并且会产生索引文件占磁盘空间。看情况而建索引,至于索引的实现原理,c写的,一牵扯到效率都会用底层语言,或者go。

四、触发器

就是个附带操作,比如创建一个触发器,每往user表加一条记录,就往日志表里加一条记录。后者插入日志表动作,就是个附带操作。由于用的少做了解即可,因为做触发器很大可能会降低此次sql操作效率,因为要等触发器完成,结果才会返回。

五、mysql的账户管理

这一系列操作只要用root用户登录才有权限!!!!

创建用户:
mysql高级(视图事务索引搭建主从架构)_第5张图片
mysql高级(视图事务索引搭建主从架构)_第6张图片
grant 权限 on 数据库.表名 to 账户@主机名 对特定数据库中的特定表授权
grant 权限 on 数据库.* to 账户@主机名   对特定数据库中的所有表给与授权
grant 权限1,权限2,权限3 on . to 账户@主机名    对所有库中的所有表给与多个授权
grant all privileges on . to 账户@主机名    对所有库和所有表授权所有权限

修改用户权限(加个with grant option即可):grant insert on news to ‘laowang’@’%’ with grant option; (修改laowang的权限为能对news数据库进行insert操作)

修改密码:update user set authentication_string=password(‘新密码’) where user=‘laowang’;要先进入mysql数据库(use mysql 见图一)

删除用户:drop user ‘laowang’@’%’;

六、mysql的数据备份和导入

1、mysql数据备份:

在这里插入图片描述
现在某个用户把他拥有权限的库删了,root也不用慌了,因为
root用户使用这条命令把所有数据库数据都拷贝了一份,最好不把密码写出来,这样写出来会有警告。不过也可以
mysql高级(视图事务索引搭建主从架构)_第7张图片

真有人删了某个库,root怎样用这个db.sql文件导回库。
需要先用一个客户端连接进mysql服务器source /root/db.sql (mysql中也有source命令),但是导入性能很低,数据量上了好几个G,要导很久。就使用xtrabackup第三方工具。

七、搭建mysql主从架构:(主节点和从节点即为主mysql服务器和从mysql服务器)

其实跟redis的主从同理:主从同步,读写分离,主从也是负载均衡的表现,为了害怕请求把mysql服务器打崩,所以MySQL也要做主从,这里就说mysql的单向主从,其实mysql还有双向。前面说了,redis很人性化,我只要配置slaveof启动,从节点自动同步它的主节点的所有数据,并且主节点宕哨兵自动选举其他从节点。在mysql中也是一样可以做主从。

我用的docker,我用服务器的3307和8011跑了两个mysql容器,前者作主节点,后者作从节点。

先准备好个目录把mysql的配置文件放进去,直接执行此命令,不要直接用mysql最新版镜像,我用的5.7.29版本,所以要用imageID来跑。
docker run -id -p 8011:3306 -v $PWD/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234562 --name mysql_slave2 841
在这里插入图片描述
1、去修改主节点的配置文件,只需要加两行:server-id=10和log-bin=mymaster-logbin 跑起来就可以了,如果主节点已经在跑了就docker restart一下使配置生效,然后连接上我想用做master主库的3307的mysql服务器容器,敲入下图命令,验证是否master成功
mysql高级(视图事务索引搭建主从架构)_第8张图片
File是二进制日志文件名,Position 是日志开始的位置。后面从库会用到 后面从库会用到 后面从库会用到position参数

2、在主库中添加要进行数据同步用户,授予普通用户slave的身份:
grant replication slave on * .* to ‘laowang’@’%’;
那个ip直接写% 就好。要不然换个地方换了ip就要重新跑一下这个授权命令。

3、锁定数据库的库表,禁止写入,实现对主数据库锁表只读,防止数据写入,数据复制失败
flush table with read lock;(锁住整个服务器里的所有库表)
show master status;(记录位置)
记录开始位置(还是154,因为我没有改动数据)

4、导出主库数据:mysqldump -uroot -h 服务器ip -P3307 -p --all-databases > /root/db.sql(路径自定)

5、主节点远程传输db.sql给从节点:
(这步可省,我直接用主节点机上的mysql客户端连从节点就可以了,也达到了能使用db.sql的目的,就不用传db.sql了)
本地连接进入从节点后:
source /root/db.sql 用docker跑redis和mysql服务不要进容器使用容器的客户端(redis-cli或mysql)连接服务,直接在物理机装客户端连mysql或redis服务。

导入后发现从节点原来密码登不进去了,因为我是主节点的所有数据库导入,会自动覆盖从节点的所有数据,现在从节点的所有数据包括root用户已经被主节点取代了,主节点的root及密码所有东西都导入了到了从节点,两个库一摸一样,登录从节点也要用主节点的用户密码。

这就是为啥我在第二步要授予一个用户slave身份,因为主从公用主节点的数据库系统,主节点上更新数据后能不能在某个用户管辖的数据库中同步,就要看用户有没有slave身份。

6、配置从节点的配置文件

拿到从节点的配置文件my.cnf,前面主节点的配置文件是往原始配置文件里添加server-id=10,log-bin=mymaster-logbin 两行,这里从节点就要往原始配置文件里添加server-id=3和read-only-true两行。然后docker restart 从节点使配置生效。(10和3只是为了区分主从,你自己随便定个数也行)

7、重启从节点后,以root连接进从节点(下面的语句都是在从节点的命令行执行):

思考:到现在,主从节点可以看成一个库,连用户都一摸一样,其实上一步的配置:server-id=3和read-only-true两行,就是为了告诉从节点,虽然你跟主节点数据一摸一样,但是你只能读不能写。现在我用(它们共有的)root用户和密码登录从节点服务器来验证从节点是不是read_only,

mysql高级(视图事务索引搭建主从架构)_第9张图片
居然可以创建?其实,你这里用共有的root账户登录从节点的话,read-only是对root用户无效的,root是老大,不管你声明它是属于哪个节点的。这就是为啥要在第二步,在主节点里面创建一个laowang普通用户 ,那同理,我现在用老王可以登进从节点吗,肯定可以!因为从节点中的数据已经被主节点取代了,前面做了主从复制。好我现在以laowang登录进从节点,看老万可不可以创建数据库(改操作)
mysql高级(视图事务索引搭建主从架构)_第10张图片
现在只完成主从复制,读写分离了,更重要的是主从自动同步,回想起redis多好,设置了主从就自动同步,难道每次改主节点数据都要导出再导入从节点吗,肯定不是。到mysql还是可以开启同步功能,但要设置一下:

一条语句开启主从之间的复制关系

change master to master_host=‘120.27.242.29’,
master_user=‘laowang’,
master_port=3307,(我是用docker,通过端口来区分主从节点的)
master_password=‘12345’,
master_log_file=‘mymaster-logbin.000001’,
master_log_pos=154;(154是我上面记录的那个postion参数值)

8、开启slave同步功能:
start slave;

9、检查从节点的主从是否正确:
show slave status \G;(查看有两个参数yes)

10、解锁主节点,往主节点写数据,查看从节点是否同步:
unlock tables;(让root创建个数据库或让laowang创建,用laowang的话还要用root授权laowang对*.*(所有数据库及表)的create权限)还有,不要在配置主从过程中第三步上锁后重启主节点,否则上的锁就无效了,上锁只是为了不让其他用户连进库改数据,自己测试可以省略第3步和这最后一步解锁

你可能感兴趣的:(mysql高级(视图事务索引搭建主从架构))