一、读写分离(主从复制)
至少两台数据库服务器,可以分别设置主服务器和从服务器,对主服务器的任何操作都会同步到从服务器上。 主要作用:分担压力,备份数据
实现原理
mysql中有一种日志,叫做bin日志(二进制日志),会记录下所有修改过数据库的sql语句。主从复制的原理实际是多台服务器都开启bin日志,然后主服务器会把执行过的sql语句记录到bin日志中,之后从服务器读取该日志,在从服务器再把bin日志中记录的sql语句同样的执行一遍。这样从服务器上的数据就和主服务器相同了。
首先登陆主服务器需要分配一个账户给从服务器 添加账号(用户)命令如下:
//授权账户给xiaohei
grant all on *.* to ‘xiaohei’@’%’ identified by ‘1234’
查看是否分配成功可以查看user表
select * from mysql.user
如果需要删除 命令如下:
drop user 'xiaohei'@'%'
都知道mysql是通过日志来实现同步的 那么如何区操作日志呢??
//首先需要配置my.conf 的log-bin日志文件 可以配置具体的路径
log-bin=d:/log.bin
//配置data-dir可以配置具体的数据存放的位置
datadir="f:/log"
//生成新的日志文件 flush log
//清空所用的日志文件 reset master
//查看最后一个的日志文件 show master status
那么如何查看记录在日志文件的内容呢??
mysqlbinlog --no-defaults 'd:/log.bin'
搭建主从服务器:
搭建主服务器:
在my.conf中设置 server-id =1 ,log-bin已经进行了配置了
账户的授权:
grant replication slave on *.* to 'slave'@'%' identified by '1234';
记录主服务器最新的二进制的名称和位置
show master status;
注意:此时,就禁止对主服务器执行增删改的操作,一直到从服务器配置成功。
搭建从服务器
(1)开启二进制日志。
(2)要设置一个server_id 该值不能和主服务器的相同。
登陆从服务器 并且停止
stop slave
配置语法:
change master to
master_host=”主服务器的ip地址”,master_user=”授权用户的名称”,master_password=”授权用户的密码”,master_log_file=”二进制日志文件的名称”,master_log_pos=记录的pos位置;
开启从服务器 执行start slave
查看是否配置成功
show slave status
Slave_IO_Running:Yes 此进程负责从服务器从主服务器上读取binlog 日志,并写入从服务器上的中继日志。
Slave_SQL_Running:Yes 此进程负责读取并且执行中继日志中的binlog日志,
注:以上两个都为yes则表明成功,只要其中一个进程的状态是no,则表示复制进程停止,错误原因可以从”last_error”字段的值中看到。、
读写分离的实现
'DB_RW_SEPARATE'=>true,//支持读写分离
'DB_MASTER_NUM' => 1, // 读写分离后 主服务器数量
'DB_SLAVE_NO' => '', // 指定从服务器序号,不填,查询时随机连接从服务器
具体的步骤:
(1)通过mysql授权账号,
注意:授权的账号,是给php代码连接的。
主服务器:192.168.12.253的主机授权账号如下:
从服务器:192.168.12.252的主机授权账号如下:
(2)步骤TP框架里面配置文件
(3)在TP里面,测试读写分离的配置,
通过测试发现,执行M()->query()时,是连接从服务器,执行 M()->execute()是连接主服务器。
视图
视图有两个好处:
一是可以简化sql,组建数据到视图 减少sql的查看
二是 可以权限控制 显示必要的数据
视图与表的关系
(1)视图是表的查询结果,自然表的数据改变了,影响视图的结果。
(2)如果向视图里面,添加数据,是否会影响到表里面的数据呢?
insert into it_goods_v1(goods_name,shop_price,goods_number) values('包菜',210,100);
注意:视图的数据与表的数据一一对应时,可以修改视图里面的数据,如果不是一一对应的关系,不能修改,比如下图所示,想要修改平均价格。
(3)对于视图insert还应注意,视图必须包含表中没有默认值的列。
理解:
create table it_user(
id int primary key auto_increment,
name varchar(32) not null,
age decimal(9,2) not null,
email varchar(32) not null
)engine myisam charset utf8;
注意:在实际的开发中,没有对视图进行增删改的需求,创建视图,就是查询的。
几个mysql时间函数
unix_timestamp() //时间戳
from_unixtime(unix_timestamp()) //转换为日期格式
curdate() //今天的日期
//取出某个时间段的时间
date_sub(时间日期时间,interval 数字 时间单位)