1、讀寫分離(主從複製)php
至少兩臺數據庫服務器,能夠分別設置主服務器和從服務器,對主服務器的任何操做都會同步到從服務器上。 主要做用:分擔壓力,備份數據mysql
實現原理sql
mysql中有一種日誌,叫作bin日誌(二進制日誌),會記錄下全部修改過數據庫的sql語句。主從複製的原理實際是多臺服務器都開啓bin日誌,而後主服務器會把執行過的sql語句記錄到bin日誌中,以後從服務器讀取該日誌,在從服務器再把bin日誌中記錄的sql語句一樣的執行一遍。這樣從服務器上的數據就和主服務器相同了。數據庫
首先登錄主服務器須要分配一個帳戶給從服務器 添加帳號(用戶)命令以下:服務器
//受權帳戶給xiaohei grant all on *.* to ‘xiaohei’@’%’ identified by ‘1234’
查看是否分配成功能夠查看user表框架
select * from mysql.user
若是須要刪除 命令以下:ide
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 測試
那麼如何查看記錄在日誌文件的內容呢??ui
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;
注意:在實際的開發中,沒有對視圖進行增刪改的需求,建立視圖,就是查詢的。
unix_timestamp() //時間戳 from_unixtime(unix_timestamp()) //轉換爲日期格式 curdate() //今天的日期 //取出某個時間段的時間date_sub(時間日期時間,interval 數字 時間單位)