一、使用mysqldump備份數據庫並經過備份及二進制日誌還原數據(備份完後再寫入數據,而後再刪庫)mysqldump -A --single-transaction -F --master-data=2 > /data/backup/mysql.sql 選項:-A 備份全部數據庫 -F 刷新日誌node
--single-stransaction開啓事務備份 --master-data=2記錄二進制日誌位置 備份前的數據庫
備份後在表裏插入新數據
刪庫 mysql -e 'drop database hellodb'
開始還原數據庫,在還原前臨時禁用二進制日誌,避免記錄還原過程,引發數據錯亂
還原數據庫 source /data/backup/mysql.sql
查看數據庫,徹底備份的數據還原成功
繼續還原在徹底備份以後的數據。 查看/backup/mysql.sql文件的二進制日誌的記錄點
發現最後一次的徹底備份是日誌編號06,位置爲245。 用mysqlbinlog導出二進制日誌
mysqlbinlog /var/lib/mysql/centos7-bin.000006 -v > /data/backup/log.sql 編輯日誌,將日誌文件中的drop database hellodb 刪除 而後在數據庫中導入生成的二進制日誌。

查看數據庫數據,全部數據還原成功。

三、MySQL數據備份企業實戰(shell或python腳本實現)mysql
使用xtrabackup以每週爲一個備份週期作備份(數據庫+二進制日誌,備份至本地/data/backup)react
提示: 週一某個時間點作一次徹底備份,周2、3、4、5、6、日增量sql
備份存儲目錄"/data/backup/2018/52/1/備份數據" 目錄解釋"/data/backup/年/本年度的第幾周/本週的第幾天/數據" 一年52週一周7天shell
(Andy老師提供python備份腳本參考)數據庫
#!/bin/bash
for i in `seq 0 6`;do #循環6次
a=/data/backup/`date +%Y`/`date +%U`/ #存儲目錄變量
mkdir -p $a$i # #建立目錄
t=`date +%w` #定義星期
if [ "$t" == "1" ];then #匹配星期 週一爲徹底備份
xtrabackup --backup --target-dir=/data/backup &> /dev/null && echo backup ok
else
if [ "$t" == "2" ];then #匹配星期 週二爲增量備份
xtrabackup --backup --target-dir="$a"1 --incremental-basedir=/data/backup &> /dev/null && echo backup ok
elif [ "$t" == "3" ];then
xtrabackup --backup --target-dir="$a"2 --incremental-basedir="$a"1 &> /dev/null && echo backup ok
elif [ "$t" == "4" ];then
xtrabackup --backup --target-dir="$a"3 --incremental-basedir="$a"2 &> /dev/null && echo backup ok
elif [ "$t" == "5" ];then
xtrabackup --backup --target-dir="$a"4 --incremental-basedir="$a"3 &> /dev/null && echo backup ok
elif [ "$t" == "6" ];then
xtrabackup --backup --target-dir="$a"5 --incremental-basedir="$a"4 &> /dev/null && echo backup ok
elif [ "$t" == "0" ];then
xtrabackup --backup --target-dir="$a"6 --incremental-basedir="$a"5 &> /dev/null && echo backup ok
fi
fi
done
將腳本寫入計劃任務。每日2時執行一遍備份。如逢週一則徹底備份
[root@centos7 ~]# crontab -l
0 2 * * * root /root/b.sh &>/dev/null
四、描述MySQL複製工做原理並實現主從,主主,主從級聯及半同步複製vim
一臺mysql數據庫的併發鏈接數是有限的,當併發訪問量大的時候,可能形成一臺服務器因爲壓力太大而形成的宕機,這將產生數據丟失的風險和較差的用戶體驗。因此,咱們能夠利
用mysql的binlog日誌和複製功能,組成一臺主機,多臺從機的集羣,當集羣中的一臺主數據庫寫入數據時,將主服務器的二進制日誌複製到其餘從服務器上,繼而實現同步過程。
若是主服務器宕機,則自動從多臺從服務器挑選一臺充當主服務器.
複製原理
當主服務器收到數據更新請求時,會將更新過程寫入二進制日誌中。在主服務器中,有一個專門的dump線程將二進制日誌發給從服務器。從服務器中,有一個io thread線程將接
收到的binlog寫入到relay log (相似二進制日誌)日誌中 ,而後再將relay log交給sql thread在從服務器中更改數據
主從複製
在主服務器配置文件
log-bin=/data/logbin/mysql-bin #啓用二進制日誌
server-id=1 #指定服務器編號
在從服務器配置
server-id=2 #區別於主服務器編號
read_only=on #爲了安全從服務器設置爲只讀,防止修改
在主服務器建立並受權複製帳號
grant replication slave on *.* to test@'192.168.64.%' identified by 'centos';
主服務器數據庫
從服務器數據庫
在從服務器執行主服務器修改master 信息
CHANGE MASTER TO
MASTER_HOST='192.168.64.128', #主服務ip
MASTER_USER='test', #用那個帳號複製
MASTER_PASSWORD='centos', #帳戶口令
MASTER_PORT=3306, #端口
MASTER_LOG_FILE='mysql-bin.000003', #從那個二進制日誌開始複製
MASTER_LOG_POS=245; #從二進制日誌的開始內容複製
查看從節點信息
start slave;從服務器執行復制以後就不須要在執行
複製成功

級聯複製:
主服務器複製給從服務器,做爲中間節點,再經過中間節點從服務器複製給其餘從服務器
主服務器的配置文件不變
建立並受權複製帳號
grant replication slave on *.* to test@'192.168.64.%' identified by 'centos';
在中間節點上修改配置文件
加入log_slave_updates將主節點二進制日誌記錄到本身的日誌中
並開啓二進制日誌,須要將日誌複製給下一個節點
修改master to 信息
CHANGE MASTER TO
MASTER_HOST='192.168.64.128',
MASTER_USER='test',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=245;
start slave; 開啓複製
主服務器導入表
中間節點開始導入數據
在最後一個節點修改配置文件,關閉二進制日誌,從中間節點複製二進制日誌
啓動數據庫,修改master信息爲中間節點
CHANGE MASTER TO
MASTER_HOST='192.168.64.130',
MASTER_USER='test',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=245;
同步成功
主主複製:互爲主從
容易產生的問題:兩臺數據庫都寫入數據,會形成數據不一致,所以慎用
考慮要點:自動增加id
配置一個節點使用奇數id
auto_increment_offset=1 開始點
auto_increment_increment=2 增加幅度
另外一個節點使用偶數id
auto_increment_offset=2
auto_increment_increment=2
修改主配置文件
修改另外一臺主配置文件
建立帳號
grant replication slave on *.* to test@'192.168.64.%' identified by 'centos';
在第二臺主機修改master 信息
CHANGE MASTER TO
MASTER_HOST='192.168.64.128',
MASTER_USER='test',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=245;
在第一臺主機配置
CHANGE MASTER TO
MASTER_HOST='192.168.64.130',
MASTER_USER='test',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=245;
啓動複製 start slave;
半同步複製
默認狀況下,MySQL的複製功能是異步的,異步複製能夠提供最佳的性能,主
庫把binlog日誌發送給從庫即結束,並不驗證從庫是否接收完畢。這意味着當
主服務器或從服務器端發生故障時,有可能從服務器沒有接收到主服務器發送
過來的binlog日誌,這就會形成主服務器和從服務器的數據不一致,甚至在恢
復時形成數據的丟失
須要在主服務器安裝一個半同步插件模塊semisync_master.so';
首先,實現標準的主從複製
而後在主服務器安裝插件/usr/lib64/mysql/plugin/semisync_master.so
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
在配置文件加入配置
在從節點安裝插件semisync_slave.so
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
並寫入配置文件
查看插件狀態是否啓動
SHOW GLOBAL VARIABLES LIKE '%semi%';
SHOW GLOBAL STATUS LIKE '%semi%';
從新啓動線程 stop slave; start slave;實現半同步複製
五、描述MySQL Proxy原理並實現讀寫分離後端
MySQL Proxy處於客戶端應用程序和MySQL服務器之間,經過截斷、改變並轉發客戶端和後端數據庫之間的通訊來實現其功能,這和WinGate 之類的網絡代理服務器的基本思想是同樣的。代理服務器是和TCP/IP協議打交道,而要理解MySQL Proxy的工做機制,一樣要清楚MySQL客戶端和服務器之間的通訊協議,MySQL Protocol 包括認證和查詢兩個基本過程:
認證過程包括:
客戶端向服務器發起鏈接請求
服務器向客戶端發送握手信息
客戶端向服務器發送認證請求
服務器向客戶端發送認證結果
若是認證經過,則進入查詢過程:
客戶端向服務器發起查詢請求
服務器向客戶端返回查詢結果
固然,這只是一個粗略的描述,每一個過程當中發送的包都是有固定格式的,想詳細瞭解MySQL Protocol的同窗,能夠去這裏 看看。MySQL Proxy要作的,就是介入協議的各個過程。
首先MySQL Proxy以服務器的身份接受客戶端請求,根據配置對這些請求進行分析處理,而後以客戶端的身份轉發給相應的後端數據庫服務器,再接受服務器的信息,返回給客戶端。
因此MySQL Proxy須要同時實現客戶端和服務器的協議。因爲要對客戶端發送過來的SQL語句進行分析,還須要包含一個SQL解析器。能夠說MySQL Proxy至關於一個輕量級的MySQL
了,實際上,MySQL Proxy的admin server是能夠接受SQL來查詢狀態信息的
在調度器安裝proxysql 調度器
配置一下yum源
cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF
yum install proxysql 安裝調度器
調度器配置爲數據庫方式,因此要啓動數據庫
啓動服務
準備:實現讀寫分離前,先實現主從複製
注意:slave節點須要設置read_only=1
啓動ProxySQL:service proxysql start
啓動後會監聽兩個默認端口
6032:ProxySQL的管理端口
6033:ProxySQL對外提供服務的端口
使用mysql客戶端鏈接到ProxySQL的管理接口6032,默認管理員用戶和密碼都
是admin:
mysql -uadmin -padmin -P6032 -h127.0.0.1
在數據庫中插入數據庫服務器的地址和編號,這裏編號統一爲10,後面會本身識別主從服務器
根據數據庫的配置文件read-only這項來區分
MySQL > load mysql servers to runtim
MySQL > save mysql servers to disk;
加載配置並存盤
在主數據庫建立帳號讓proxysql 監控並自動調整讀組和寫組
grant replication client on *.* to monitor@'192.168.64.%' identified by 'centos';
在proxysql調度器加入監控帳號和密碼。而且加載生效
將都組和寫組寫入表中。test爲描述無關緊要
insert into mysql_replication_hostgroups values(10,20,"test");
分組成功,若是不成功,可手寫如記錄改變編號
建立測試帳號在主服務器
grant all on *.* to sqluser@'192.168.64.%' identified by 'centos';
在proxysql服務器加入到mysq_user中
在ProxySQL配置,將用戶sqluser添加到mysql_users表中, default_hostgroup默認
組設置爲寫組10,當讀寫分離的路由規則不符合時,會訪問默認組的數據庫
insert into mysql_users(username,password,default_hostgroup)values('sqluser','centos',10);
保存並生效
load mysql users to runtim;
save mysql users to disk;
在proxysql調度器上用sqluser帳戶鏈接,利用6033端口。
默認sqluser在10這個主機組。也就是mysql的主數據庫 默認全部操做都在主數據庫上操做。
配置路由規則。實現讀寫分離
與規則有關的表:mysql_query_rules和mysql_query_rules_fast_routing,
插入路由規則:將select語句分離到20的讀組,select語句中有一個特殊語句
SELECT...FOR UPDATE它會申請寫鎖,應路由到10的寫組
insert into mysql_query_rules
(rule_id,active,match_digest,destination_hostgroup,apply)VALUES
(1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);
##除了讀操做發往從節點,其餘操做都發往主節點
到此,讀寫分離配置完成
驗證。讀爲從服務器
mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e 'select @@server_id'
利用事物查看,爲主服務器
