MySQL應(yīng)用實(shí)踐

《老男孩Linux運(yùn)維》筆記
MySQL-Documentation




概述

MySQL介紹

MySQL屬于傳統(tǒng)關(guān)系型數(shù)據(jù)庫產(chǎn)品二蓝,它開放式的架構(gòu)使得用戶選擇性很強(qiáng)奶陈,同時(shí)社區(qū)開發(fā)與維護(hù)人數(shù)眾多。
MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng)呵曹,關(guān)系型數(shù)據(jù)庫的特點(diǎn)是將數(shù)據(jù)保存在不同的表中,再將這些表放入不同的數(shù)據(jù)庫中,而不是將所有數(shù)據(jù)統(tǒng)一放在一個(gè)大倉庫里辐宾,這樣的設(shè)計(jì)增加了MySQL的讀取速度,而且靈活性和可管理型也得到了很大提高膨蛮。
訪問和管理MySQL數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言為SQL結(jié)構(gòu)化查詢語言叠纹。


MariaDB介紹

自從甲骨文公司收購了MySQL之后,為了避免Oracle將MySQL閉源敞葛,MySQL社區(qū)采用分支的方式來避開這個(gè)風(fēng)險(xiǎn)誉察。MariaDB就這樣誕生了。
MariaDB是一個(gè)向后兼容惹谐,可能在以后替代MySQL的數(shù)據(jù)庫產(chǎn)品持偏。


MySQL多實(shí)例介紹

什么是MySQL多實(shí)例

MySQL多實(shí)例就是在一臺服務(wù)器上同時(shí)開啟多個(gè)不同的服務(wù)器端口(如3306, 3307)驼卖,同時(shí)運(yùn)行多個(gè)MySQL服務(wù)進(jìn)程,這些服務(wù)進(jìn)程通過不同的socket監(jiān)聽不同的服務(wù)器端口來提供服務(wù)鸿秆。

這些MySQL多實(shí)例公用一套MySQL安裝程序酌畜,使用不同的 my.cnf(也可以相同)和數(shù)據(jù)文件。在提供服務(wù)時(shí)卿叽,多實(shí)例MySQL在邏輯上看起來是各自獨(dú)立的桥胞,他們根據(jù)配置文件的對應(yīng)設(shè)定值,獲得服務(wù)器相應(yīng)數(shù)量的硬件資源考婴。

其實(shí)很多網(wǎng)絡(luò)服務(wù)都是可以配置多實(shí)例的贩虾,如 Nginx,Apache沥阱,Mongodb缎罢,Redis等。

MySQL多實(shí)例的作用與問題

MySQL多實(shí)例作用:

  1. 有效利用服務(wù)器資源喳钟;
  2. 節(jié)約服務(wù)器資源屁使;

MySQL多實(shí)例有它的好處,也有其弊端奔则。比如蛮寂,會存在資源互相搶占的問題


MySQL多實(shí)例的應(yīng)用場景

  1. 資金緊張型公司的選擇;
  2. 并發(fā)訪問不是特別大的業(yè)務(wù)易茬;
  3. 門戶網(wǎng)站應(yīng)用MySQL多實(shí)例場景酬蹋;


MySQL多實(shí)例常見的配置方案

單一配置文件、單一啟動程序的多實(shí)例部署方案

單一配置文件抽莱、單一啟動程序?qū)嵤┓桨浮?br> vim /etc/my.cnf

[mysqld_multi]
mysqld = /bin/mysqld_safe
mysqladmin = /bin/mysqladmin
user = mysql

[mysqld1]
socket = /dir/path/mysql.sock
port = 3306
pid-file = /dir/path/mysql.pid
datedir = /dir/path/mysql
user = mysql

[mysql2]
socket = /path/mysql.sock
port = 3307
pid-file = /path/mysql.pid
datedir = /path/mysql
user = mysql

啟動命令:
mysqld_multi --config-file=/path/my.cnf start 1,2

不建議使用單一配置文件和單一啟動程序部署多實(shí)例方案



安裝并配置多實(shí)例MySQL數(shù)據(jù)庫

安裝MySQL多實(shí)例

安裝MySQL依賴包
yum install -y ncurses-devel libaio-devel

安裝MySQL

  1. 源碼安裝:
useradd -s /sbin/nologin -M mysql
wget  mysql源碼包
tar mysql壓縮包
cd mysql-xxx
./configure
make&&make install
  1. rpm包安裝:
wget http://repo.mysql.com/xxx 選擇匹配的版本
rpm -ivh mysql.xxx.rpm
yum install mysql-server


創(chuàng)建MySQL多實(shí)例的數(shù)據(jù)文件目錄

mkdir -p /var/mysql/{3306,3307,3308}/db


創(chuàng)建MySQL多實(shí)例的配置文件

MySQL數(shù)據(jù)庫默認(rèn)為用戶提供了多個(gè)配置文件模板范抓,用戶可以根據(jù)服務(wù)器硬件配置的大小來選擇。

vi /var/mysql/3306/my06.cnf
vi /var/mysql/3307/my07.cnf
vi /var/mysql/3308/my08.cnf

為了讓MySQL多實(shí)例之間彼此獨(dú)立食铐,要為每一個(gè)實(shí)例建立一個(gè) my.cnf 配置文件和一個(gè)啟動文件MySQL匕垫,讓它們分別對應(yīng)自己的數(shù)據(jù)文件目錄 db。


3306實(shí)例 3307實(shí)例 3308實(shí)例
[ client ]
port = 3306
socket = /var/mysql/3306/mysql.sock

[ mysql ]
no-auto-rehash

[ mysqld ]
user = mysql
port = 3306
socket = /var/mysql/3306/mysql.sock
basedir = /bin/mysql
datadir = /var/mysql/3306/db
以及其他優(yōu)化信息

[ mysql_safe ]
pid-file = /var/mysql/3306/mysql.pid
log-error = /var/log/mysql/mysql06.log
[ client ]
port = 3307
socket = /var/mysql/3307/mysql.sock

[ mysql ]
no-auto-rehash

[ mysqld ]
user = mysql
port = 3307
socket = /var/mysql/3307/mysql.sock
basedir = /bin/mysql
datadir = /var/mysql/3307/db
以及其他優(yōu)化信息

[ mysqld_safe ]
pid-file = /var/mysql/3307/mysql.pid
log-error = /var/log/mysql/mysql07.log
[ client ]
port = 3308
socket = /var/mysql/3308/mysql.sock

[ mysql ]
no-auto-rehash

[ mysqld ]
user = mysql
port = 3308
socket = /var/mysql/3308/mysql.sock
basedir = /bin/mysql
datadir = /var/mysql/3308/db
以及其他優(yōu)化信息

[ mysqld_safe ]
pid-file = /var/mysql/3308/mysql.pid
log-error = /var/log/mysql/mysql08.log


創(chuàng)建MySQL多實(shí)例的啟動程序

創(chuàng)建MySQL啟動文件

vim /var/mysql/3306/mysql.sh
vim /var/mysql/3307/mysql.sh
vim /var/mysql/3308/mysql.sh

這幾個(gè)啟動MySQL實(shí)例的腳本自己根據(jù)需要來寫虐呻。
在多實(shí)例啟動文件中象泵,啟動MySQL不同實(shí)例服務(wù),所執(zhí)行的命令實(shí)質(zhì)是有區(qū)別的斟叼。

mysqld_sage --defaulte-files=/var/mysql/3306/my06.cnf >/dev/null 2>&1
mysqladmin -u root -p passwd -S /var/mysql/3306/mysql.sock shutdown


配置MySQL多實(shí)例文件權(quán)限

建議權(quán)限:700


MySQL相關(guān)命令加入全局路徑的配置

配置MySQL全局路徑

which mysql
echo 'export PATH=/path/xxx/mysql/bin:$PATH' >> /etc/profile
echo $PATH 查看



或者使用軟連接的方法

ln -s /path/xxx/mysql/bin/* /usr/local/sbin/

務(wù)必把MySQL命令路徑放在PATH路徑中其他路徑的前面偶惠,否則,可能會導(dǎo)致使用的 mysql 命令不是同一個(gè)朗涩,進(jìn)而產(chǎn)生錯(cuò)誤忽孽。


啟動MySQL多實(shí)例數(shù)據(jù)庫

/var/mysql/3306/mysql.sh start
/var/mysql/3307/mysql.sh start
/var/mysql/3308/mysql.sh start

如果發(fā)現(xiàn)沒有顯示MySQL對應(yīng)實(shí)施的端口,請稍等幾秒在檢查,MySQL服務(wù)的啟動比Web服務(wù)慢一些兄一;
請查看錯(cuò)誤日志


配置及管理MySQL多實(shí)例數(shù)據(jù)庫

服務(wù)的開機(jī)自啟動很關(guān)鍵厘线!把MySQL多實(shí)例的啟動命令加入 /etc/rc.local,實(shí)現(xiàn)開機(jī)自啟動瘾腰。

echo "/var/mysql/3306/mysql.sh start
echo "/var/mysql/3307/mysql.sh start
echo "/var/mysql/3308/mysql.sh start

socket connect
mysql -S /var/mysql/3306/mysql.sock

MySQL安全配置:

mysqladmin -uroot -S /var/mysql/3306/mysql.sock -ppasswd    #設(shè)置密碼
mysql -uroot -S /var/mysql/3306/mysql.sock -p

禁止使用 kill -9 等命令強(qiáng)制殺死數(shù)據(jù)庫皆的,這會引起數(shù)據(jù)庫無法啟動等故障發(fā)生。


MySQL主從復(fù)制介紹

MySQL的主從復(fù)制并不是數(shù)據(jù)庫磁盤上的文件直接拷貝蹋盆,而是通過邏輯的 binlog 日志復(fù)制到要同步的服務(wù)器本地费薄,然后由本地的線程讀取日志里面的 SQL 語句,重新應(yīng)用到MySQL數(shù)據(jù)庫匯總栖雾。

MySQL數(shù)據(jù)庫支持單向楞抡、雙向、鏈?zhǔn)郊壜?lián)析藕、環(huán)狀等不同業(yè)務(wù)場景的復(fù)制召廷。
在復(fù)制過程中,一臺服務(wù)器充當(dāng) 主服務(wù)器(Master)账胧, 接收來自用戶的內(nèi)容更新竞慢;
而一個(gè)或多個(gè)的其他服務(wù)器充當(dāng)從服務(wù)器(Slave),接收來自主服務(wù)器 binlog 文件的日志內(nèi)容治泥,解析出SQL筹煮,重新更新到從服務(wù)器,使得主從服務(wù)器數(shù)據(jù)達(dá)到一致居夹;
如果設(shè)置了鏈?zhǔn)郊壜?lián)败潦,那么,從服務(wù)器(Slave)本身除了充當(dāng)從服務(wù)器外准脂,也會同時(shí)充當(dāng)其下面從服務(wù)器的主服務(wù)器劫扒。鏈?zhǔn)郊壜?lián)復(fù)制類似 A-->B-->C 的復(fù)制形式。

一主一從邏輯圖
一主多從邏輯圖
雙向主主復(fù)制邏輯圖
線性級聯(lián)單向雙主復(fù)制邏輯圖
環(huán)狀級聯(lián)單向多主同步邏輯圖
MySQL常見復(fù)制架構(gòu)圖



MySQL主從復(fù)制都是異步的復(fù)制方式狸膏,既不是嚴(yán)格實(shí)時(shí)的數(shù)據(jù)同步沟饥,但是正常情況下給用戶的體驗(yàn)是實(shí)時(shí)的。


MySQL主從復(fù)制的企業(yè)應(yīng)用場景

MySQL主從復(fù)制集群功能使得MySQL數(shù)據(jù)庫支持大規(guī)模高并發(fā)讀寫成為可能湾戳,同時(shí)有效保護(hù)了物理服務(wù)器宕機(jī)場景的數(shù)據(jù)備份闷板。

應(yīng)用場景1:從服務(wù)器作為主服務(wù)器的實(shí)時(shí)數(shù)據(jù)備份
主從服務(wù)器架構(gòu)的設(shè)置可以大大加強(qiáng)MySQL數(shù)據(jù)庫架構(gòu)的健壯性。當(dāng)主服務(wù)器出現(xiàn)問題時(shí)院塞,可設(shè)置自動切換到從服務(wù)器繼續(xù)提供服務(wù),此時(shí)從服務(wù)器的數(shù)據(jù)與宕機(jī)時(shí)的主數(shù)據(jù)庫幾乎是一模一樣的性昭。
這類似 NFS 儲存數(shù)據(jù)通過 inotify+rsync 同步到備份的 NFS服務(wù)器拦止,只不過MySQL的復(fù)制方案是其自帶的工具。
利用MySQL的復(fù)制功能進(jìn)行數(shù)據(jù)備份時(shí),在硬件故障汹族、軟件故障的場景下萧求,該數(shù)據(jù)備份是有效的;但是對于人為地執(zhí)行 drop , delete 等語句刪除數(shù)據(jù)的情況顶瞒,從庫的備份功能就沒用了夸政,因?yàn)閺姆?wù)器也會執(zhí)行刪除的語句。

應(yīng)用場景2:主從服務(wù)器實(shí)現(xiàn)讀寫分離榴徐,從服務(wù)器實(shí)現(xiàn)負(fù)載均衡
主從服務(wù)器架構(gòu)可通過程序(PHP守问,Java等)或代理軟件實(shí)現(xiàn)對用戶(客戶端)的請求讀寫分離。即讓重復(fù)服務(wù)器僅僅處理用戶的 select 查詢請求坑资,降低用戶查詢響應(yīng)時(shí)間耗帕,以及同事讀寫在主服務(wù)器上帶來的訪問壓力; 對于更新的數(shù)據(jù)袱贮,如update, insert, delete等仿便,仍交給主服務(wù)器處理。確保主服務(wù)器和從服務(wù)器保持實(shí)時(shí)同步攒巍。

百度嗽仪、淘寶等絕大多數(shù)網(wǎng)站都是用戶瀏覽頁面多余用戶發(fā)布內(nèi)容,因此通過在從服務(wù)器上接受 只讀請求柒莉,就可以很好地減輕主庫的 讀壓力闻坚,且從服務(wù)器可以很容易地?cái)U(kuò)展為多臺,使用LVS做負(fù)載均衡效果就非常幫棒了常柄。
這就是傳說中的數(shù)據(jù)庫讀寫分離架構(gòu)

應(yīng)用場景3:把多個(gè)從服務(wù)器根據(jù)業(yè)務(wù)重要性進(jìn)行拆分訪問
可以把幾個(gè)不同的從服務(wù)器鲤氢,根據(jù)公司的業(yè)務(wù)進(jìn)行拆分。如:

用來做查詢服務(wù)的從服務(wù)器西潘;
用來做數(shù)據(jù)備份的從服務(wù)器卷玉;
為公司人員提供訪問的從服務(wù)器;
為開發(fā)人員使用的從服務(wù)器喷市;

這樣的拆分減輕了主服務(wù)器的壓力外相种,還可以是數(shù)據(jù)庫各個(gè)業(yè)務(wù)互不影響。


實(shí)現(xiàn)MySQL主從讀寫分離的方案

1. 通過程序?qū)崿F(xiàn)讀寫分離(推薦)
PHP和Java等程序都可以通過設(shè)置多個(gè)連接文件輕松地實(shí)現(xiàn)對數(shù)據(jù)庫的讀寫分離品姓,即當(dāng)語句關(guān)鍵字為 select 時(shí)寝并,就去連接 讀庫 的連接文件,若為 update, insert, delete 時(shí)腹备,則連接寫庫的連接文件衬潦。

MySQL主從復(fù)制根據(jù)業(yè)務(wù)拆分從庫方案

2. 通過開源軟件實(shí)現(xiàn)讀寫分離

3. 大型門戶獨(dú)立開發(fā) DAL 層綜合軟件
像百度、阿里等大型門戶都會自己開發(fā)適合自己業(yè)務(wù)的讀寫分離植酥、負(fù)載均衡镀岛、監(jiān)控報(bào)警弦牡、自動擴(kuò)容等一系列功能的DAL層軟件。

MySQL讀寫分離的基本邏輯圖


MySQL主從復(fù)制原理介紹

MySQL的主從復(fù)制是一個(gè)異步的復(fù)制過程漂羊,雖然一般情況下感覺是實(shí)時(shí)的驾锰。數(shù)據(jù)將從一個(gè)MySQL數(shù)據(jù)庫(Master)復(fù)制到另一個(gè)MySQL數(shù)據(jù)庫(Slave)。
在Master與Slave之間實(shí)現(xiàn)整個(gè)主從復(fù)制的過程是由三個(gè)線程參與完成的走越。其中有兩個(gè)線程(SQL線程和I/O線程)在Slave端椭豫,另外一個(gè)線程(I/O線程)在Master端。

要實(shí)現(xiàn)MySQL的主從復(fù)制旨指,首先必須打開Master端的 binlog 記錄功能赏酥,否則就無法實(shí)現(xiàn)。因?yàn)檎麄€(gè)復(fù)制過程實(shí)際上就是Slave從Master端獲取 binlog 日志淤毛,然后再在Slave上以相同順序執(zhí)行獲取的 binlog 日志中所記錄的各種 SQL 操作今缚。

 打開MySQL的binlog功能
vim /etc/my.cnf
[ mysqld ]
log-bin = /path/mysql-bin

注意是放在 [mysqld]里,不要放錯(cuò)位置了低淡!


MySQL主從復(fù)制原理過程詳解

  1. 在Slave服務(wù)器上執(zhí)行 start slave 命令開啟主從復(fù)制開關(guān)姓言,開始,開始進(jìn)行主從復(fù)制蔗蹋;
  2. Slave服務(wù)器的I/O線程會通過在Master上已經(jīng)授權(quán)的復(fù)制用戶權(quán)限請求連接Master服務(wù)器何荚,并請求從指定 binlog 日志文件的指定位置(日志文件名和位置就是在配置主從復(fù)制服務(wù)時(shí)執(zhí)行 change master 命令指定的),之后開始發(fā)送 binlog 日志內(nèi)容猪杭。
  3. Master服務(wù)器接收到來自Slave服務(wù)器的I/O線程請求后餐塘,其上負(fù)責(zé)復(fù)制的I/O線程會根據(jù)Slave服務(wù)器的I/O線程請求的信息分批讀取指定 binlog 日志文件指定位置之后的 binlog 日志信息,然后返回給 Slave 端的I/O線程皂吮。返回的信息中除了 binlog 日志內(nèi)容外戒傻,還有在Master服務(wù)器端記錄的新的 binlog 文件名稱,以及在新的 binlog 中的下一個(gè)指定更新位置蜂筹。
  4. 當(dāng)Slave服務(wù)器的I/O線程獲取到Master服務(wù)器上I/O線程發(fā)送的日志內(nèi)容需纳、日志文件及位置點(diǎn)后,會將 binlog 日志內(nèi)容依次寫到Slave端自身的 Relay Log(中繼文件)的最末端艺挪,并將新的 binlog 文件名和位置記錄到 master-info 文件中不翩,以便下一次讀取Master端新 binlog 日志時(shí)能夠告訴Master服務(wù)器從新binlog 日志的指定文件及位置開始請求新的 binlog 日志內(nèi)容;
  5. Slave服務(wù)器端的SQL線程會實(shí)時(shí)監(jiān)測本地的 Relay Log 中 I/O線程新增加的日志內(nèi)容麻裳,然后及時(shí)地把Relay Log文件中的內(nèi)容解析成SQL語句口蝠,并在自身Slave服務(wù)器上按解析SQL語句的位置順序執(zhí)行應(yīng)用這些SQL語句,并在relay-log.info中記錄當(dāng)前應(yīng)用中繼日志的文件名和位置點(diǎn)津坑。
MySQL主從復(fù)制基本原理邏輯圖

小結(jié):

  • 主從復(fù)制是異步邏輯的SQL語句級的復(fù)制妙蔗;
  • 復(fù)制時(shí),主庫有一個(gè)I/O線程疆瑰,從庫有兩個(gè)線程眉反,即I/O和SQL線程狞谱;
  • 實(shí)現(xiàn)主從復(fù)制的必要條件是主庫要開啟記錄的 binlog 功能;
  • 作為復(fù)制的所有MySQL節(jié)點(diǎn)的server-id都不能相同禁漓;
  • binlog文件只記錄對數(shù)據(jù)庫有更改的SQL語句,不記錄任何查詢語句孵睬。


MySQL主從復(fù)制實(shí)踐

主從復(fù)制實(shí)踐

MySQL主從復(fù)制實(shí)踐對環(huán)境要求較簡單播歼,可以是單機(jī)單數(shù)據(jù)庫多實(shí)例(3306,3307,3308)的環(huán)境掰读;也可以是多臺服務(wù)器秘狞,每個(gè)服務(wù)器一個(gè)獨(dú)立數(shù)據(jù)庫的環(huán)境。
建議使用多服務(wù)器實(shí)現(xiàn)數(shù)據(jù)庫主從功能蹈集!

單機(jī)數(shù)據(jù)庫多實(shí)例

1. 主從復(fù)制數(shù)據(jù)庫單機(jī)多實(shí)例環(huán)境準(zhǔn)備
使用前面配置的 3306,3307,3308三個(gè)實(shí)例

2. 定義主從復(fù)制需要的服務(wù)器角色
主庫及從庫名稱烁试、IP词疼、Port信息:

Master绞幌,ip:3306;
Slave1徊都,ip:3307郭怪;
Slave2支示,ip:3308;

3. 在主庫Master上執(zhí)行操作配置
設(shè)置server-id并開啟binlog功能參數(shù)
vim ./3306/my.cnf

[mysqld]
server-id = 1
log-bin = /path/3306/mysql-bin

提示:

  • 這兩個(gè)參數(shù)一定要放置于[mysqld]模塊下鄙才,否則會出錯(cuò)颂鸿;
  • server-id建議使用服務(wù)器ip最后一個(gè)點(diǎn)分十進(jìn)制數(shù),目的是避免不同機(jī)器或?qū)嵗?ID 重復(fù)攒庵;
  • 參數(shù)不能重復(fù)嘴纺;
  • 修改參數(shù)后重啟數(shù)據(jù)庫。

4. 在主庫上建立用于主從復(fù)制的賬號
登錄主庫3306:
mysql -uroot -ppasswd -S /path/3306/mysql.sock
件利用與從庫復(fù)制的賬號:

grant replication slave on *.* to 'rep'@'192.168.0.%' identified by 'passwd'浓冒;

#登錄之后
flush privilege栽渴;

#grant 權(quán)限1,權(quán)限2,…權(quán)限n on 數(shù)據(jù)庫名.表名稱 to 用戶名@用戶地址 identified by ‘連接口令’;
# 192.168.0.%代表此網(wǎng)段

select user,host form mysql.user where user='rep'裆蒸;

5. 實(shí)現(xiàn)對主數(shù)據(jù)庫鎖表只讀
對主數(shù)據(jù)庫鎖表只讀:

flush table with read lock熔萧;

在引擎不同的情況下,這個(gè)鎖表命令的時(shí)間會受下面參數(shù)的控制僚祷。鎖表時(shí)佛致,如果超過設(shè)置時(shí)間不操作會自動解鎖。

默認(rèn)情況下自動解鎖的時(shí)長參數(shù)

鎖表后查看主庫狀態(tài):
mysql> show master status;

鎖表后導(dǎo)出數(shù)據(jù)庫:
mysqldump -uusername -ppasswd -S /path/mysql.sock xxxxx

導(dǎo)出數(shù)據(jù)完畢后辙谜,解鎖主庫俺榆,恢復(fù)可寫:
mysql> unlock tables;

6. 把主庫導(dǎo)出的數(shù)據(jù)遷移到從庫
這里常用的命令有 scprsync等装哆,將備份的數(shù)據(jù)往異地拷貝罐脊。


在MySQL從庫上執(zhí)行的操作

1. 設(shè)置server-id并關(guān)閉binlog功能參數(shù)
數(shù)據(jù)庫的server-id一般在一套主從復(fù)制體系內(nèi)是唯一的定嗓,這里從庫的 server-id 要與主庫及其他從庫不同,并且要注釋掉從庫的 binlog 參數(shù)配置萍桌。如果從庫不做級聯(lián)復(fù)制宵溅,并且不作為備份用,就不要開啟 binlog上炎,開啟了反而會增加從庫磁盤I/O等的壓力恃逻。

這兩種情況需要打開從庫 binlog 記錄功能,記錄數(shù)據(jù)庫更新的SQL語句:

級聯(lián)同步 A-->B-->C中B時(shí)藕施,需要開啟寇损;
在從庫做數(shù)據(jù)備份,數(shù)據(jù)庫備份必須要有全備和binlog日志裳食,才是完整的備份矛市。

vim /path/3307/my.cnf

[mysqld]
server-id = 2

2. 把主庫的數(shù)據(jù)導(dǎo)入從庫

mysql -uusername -ppasswd -S /path/mysql.sock < mysql_bak.sql

3. 登錄從庫,配置復(fù)制信息
從庫連接主庫配置信息:

mysql> CHANGE MASTER TO
MASTER_HOST='192.168.1.1',
MASTER_PORT='3306',
MASTER_USER='rep',
MASTER_PASSWORD='passwd',
MASTER_LOG_FILE='mysql-bin.log',
MASTER_LOG_POS=342;

#字符串用單引號' '括起來诲祸,數(shù)值不用引號浊吏,注意內(nèi)容前后無空格,參數(shù)不能出錯(cuò)烦绳。

上述操作的原理實(shí)際上是把用戶密碼等信息寫入從庫新的 master.info 文件中卿捎。


啟動從庫同步開關(guān),測試主從復(fù)制配置

1. 啟動從庫主從復(fù)制径密,并查看狀態(tài)

mysql -uroot -ppasswd -S /path/mysql.sock -e "start slave午阵;"
#等同于 mysql> start slave;

主從復(fù)制是否成功的3項(xiàng)關(guān)鍵參數(shù):

  • Slave_IO_Running:Yes享扔,這個(gè)是I/O線程狀態(tài)底桂。I/O線程復(fù)制從從庫到主庫讀取binlog日志,并寫入從庫的中繼日志惧眠;
  • Slave_SQL_Running:Yes籽懦,這個(gè)是SQL線程狀態(tài)。SQL線程負(fù)責(zé)讀取中繼日志(relay-log)中的數(shù)據(jù)并轉(zhuǎn)換為SQL語句應(yīng)用到從數(shù)據(jù)庫中氛魁;
  • Seconds_Behind_Master:0暮顺,這個(gè)是復(fù)制過程中從庫比主庫延遲的秒數(shù),這個(gè)參數(shù)很重要秀存。

測試主從復(fù)制:
在主庫上隨便新建數(shù)據(jù)捶码,然后觀察從庫的數(shù)據(jù)狀況。


MySQL主從復(fù)制配置小結(jié)

  1. 環(huán)境實(shí)例準(zhǔn)備或链;
  2. 配置my.cnf文件惫恼;
  3. 登錄主庫并配置;
  4. 導(dǎo)出數(shù)據(jù)澳盐;
  5. 從庫配置祈纯;
  6. 從庫數(shù)據(jù)恢復(fù)令宿;
  7. 從庫開啟復(fù)制;
  8. 檢查同步狀態(tài)腕窥。




MySQL主從復(fù)制應(yīng)用技巧

工作中MySQL從庫停止復(fù)制故障

模擬重現(xiàn)故障的能力是運(yùn)維人員最重要的能力粒没。
先在從庫創(chuàng)建一個(gè)庫,然后去主庫創(chuàng)建一個(gè)同名的庫來模擬數(shù)據(jù)沖突簇爆。
然后運(yùn)行 show slave status 查看報(bào)錯(cuò)信息革娄。

讓從庫記錄binlog日志的方法

從庫需要記錄binlog的應(yīng)用場景:當(dāng)前從庫還要作為其他從庫的主庫,如級聯(lián)或互為主從的情況冕碟。

vim  /path/my.cnf

[mysqld]
log-slave-updates
log-bin = /path/mysql-bin

MySQL主從復(fù)制集群架構(gòu)的數(shù)據(jù)備份策略

有了主從復(fù)制,還需要做定時(shí) 全量 + 增量 備份嗎匆浙?答案是肯定的安寺!
因?yàn)椋绻鲙煊姓`操作(如:drop)首尼,從庫也會執(zhí)行挑庶,這樣主從庫都沒有了該數(shù)據(jù)。

把從庫作為數(shù)據(jù)庫備份服務(wù)器時(shí)软能,備份策略如下:

根據(jù)業(yè)務(wù)重要性拆分從庫

MySQL主從復(fù)制延遲問題的原因及解決方案

1. 主庫的從庫太多迎捺,導(dǎo)致復(fù)制延遲

從庫數(shù)量盡量不要超過五個(gè),要復(fù)制的節(jié)點(diǎn)數(shù)量過多查排,會導(dǎo)致復(fù)制延遲凳枝;

2. 從庫硬件比主庫差,導(dǎo)致復(fù)制延遲

查看主從系統(tǒng)配置跋核,可能是因?yàn)榕渲貌划?dāng)岖瑰;

3. 慢SQL語句過多

加入一條SQL語句執(zhí)行時(shí)間是20s,那么從執(zhí)行完畢到從庫上能查到數(shù)據(jù)至少需要20s砂代,這樣就延遲了20s蹋订;
一般要把SQL語句的優(yōu)化作為常規(guī)工作,不斷地進(jìn)行監(jiān)控和優(yōu)化刻伊。如果單個(gè)SQL的寫入時(shí)間長露戒,可以修改后分多次寫入;
通過查看慢查詢?nèi)罩净? show full processlist 命令捶箱,找出執(zhí)行時(shí)間長的慢查詢語句或大的事務(wù)智什。

4. 主從復(fù)制的設(shè)計(jì)問題
如,主從復(fù)制單線程讼呢,如果主庫寫并發(fā)太大撩鹿,來不及傳送到從庫,就會導(dǎo)致延遲悦屏;

5. 主從庫之間的網(wǎng)絡(luò)問題
主從庫之間的網(wǎng)卡节沦、線路键思、連接設(shè)備等都有可能稱為復(fù)制的瓶頸,導(dǎo)致延遲甫贯;

6. 主庫讀寫壓力大吼鳞,導(dǎo)致復(fù)制延遲
主機(jī)硬件搞好一點(diǎn),增加buffer叫搁。

通過read-only參數(shù)讓從庫只讀訪問

read-only參數(shù)可以讓從服務(wù)器只允許來自從服務(wù)器線程或具有SUPER權(quán)限的數(shù)據(jù)庫用戶進(jìn)行更新赔桌,確保從服務(wù)器不接受來自用戶端的非法用戶更新。
方法一:直接帶 --read-only 參數(shù)啟動或重啟數(shù)據(jù)庫

mysql xxxxx --read-only

方法二:vim /path/my.cnf

[mysqld]
read-only

MySQL主從復(fù)制讀寫分離集群

讀寫分離賬戶設(shè)置
主從庫渴逻,賬戶權(quán)限疾党,訪問IP等······

#Master
GRANT SELECT, INSERT, 權(quán)限 ON  'database'.'table' TO 'user'@'ip' identified by 'passwd';

#Slave
GRANT SELECT ON 'database'.'table' TO 'user'@'ip' identified by 'passwd';

flush privilege;




重點(diǎn)

  1. MySQL多實(shí)例的實(shí)現(xiàn)原理和實(shí)戰(zhàn)部署;
  2. MySQL主從復(fù)制的原理惨奕;
  3. MySQL主從復(fù)制的實(shí)踐雪位;
  4. MySQL主從復(fù)制故障解決思路;
  5. MySQL主從復(fù)制延遲原因及解決思路梨撞;
  6. MySQL主從復(fù)制集群雹洗,從庫備份的思想和思路;
  7. MySQL主從復(fù)制讀寫分離授權(quán)訪問用戶方案卧波;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末时肿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子港粱,更是在濱河造成了極大的恐慌螃成,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件查坪,死亡現(xiàn)場離奇詭異锈颗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)咪惠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門击吱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遥昧,你說我怎么就攤上這事覆醇。” “怎么了炭臭?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵永脓,是天一觀的道長。 經(jīng)常有香客問我鞋仍,道長常摧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮落午,結(jié)果婚禮上谎懦,老公的妹妹穿的比我還像新娘。我一直安慰自己溃斋,他們只是感情好界拦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梗劫,像睡著了一般享甸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梳侨,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天蛉威,我揣著相機(jī)與錄音,去河邊找鬼走哺。 笑死瓷翻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的割坠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼妒牙,長吁一口氣:“原來是場噩夢啊……” “哼彼哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起湘今,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤敢朱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后摩瞎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拴签,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年旗们,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚓哩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡上渴,死狀恐怖岸梨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稠氮,我是刑警寧澤曹阔,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站隔披,受9級特大地震影響赃份,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奢米,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一抓韩、第九天 我趴在偏房一處隱蔽的房頂上張望纠永。 院中可真熱鬧,春花似錦园蝠、人聲如沸渺蒿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茂装。三九已至,卻和暖如春善延,著一層夾襖步出監(jiān)牢的瞬間少态,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工易遣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彼妻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓豆茫,卻偏偏與公主長得像侨歉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子揩魂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容