MYSQL主從同步是目前使用比較普遍的數據庫架構,技術比較成熟,配置也不復雜,特別是對於負載比較大的網站,主從同步可以有效緩解數據庫讀寫的壓力。html
MYSQL主從同步是在MySQL主從複製(Master-Slave Replication)基礎上實現的,經過設置在Master MySQL上的binlog(使其處於打開狀態),Slave MySQL上經過一個I/O線程從Master MySQL上讀取binlog,而後傳輸到Slave MySQL的中繼日誌中,而後Slave MySQL的SQL線程從中繼日誌中讀取中繼日誌,而後應用到Slave MySQL的數據庫中。這樣實現了主從數據同步功能。mysql
一、能夠做爲一種備份機制,至關於熱備份
二、能夠用來作讀寫分離,均衡數據庫負載sql
# 主要步驟: 1. 安裝主數據庫 2. 修改root帳號密碼,root帳號遠程登陸 3. 安裝從數據庫 4. 修改root帳號密碼,root帳號遠程登陸,密碼和主數據庫密碼相同 5. 主數據庫修改配置,添加server-id,添加bin-log文件 6. 主數據庫建立同步帳號,指定內網ip能夠訪問,設定同步密碼,使用從數據庫鏈接主數據庫測試連通性 7. 主數據庫刷新表,鎖住全部的表,查看master狀態,記錄bin-log文件和當前的定位編號 8. 使用mysqladmin備份數據庫,沒有數據能夠忽略這一步,數據量大的狀況下使用mysqldump來備份數據 9. 從數據庫服務器配置server-id,將備份數據導入從服務器。開啓binlog等配置 10. 從數據庫修改配置,添加同步帳戶信息以及bin-log文件和當前的定位編號 11. 開啓同步,主數據庫接觸鎖定。
一、二、三、4:單機安裝mysql教程數據庫
cd /app mkdir mysql cd mysql # 下載mysql的包,可使用服務器下載,也能夠本地下載,上傳到服務器上去 wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.21-1.el7.x86_64.rpm-bundle.tar tar -xvf mysql-5.7.21-1.el7.x86_64.rpm-bundle.tar # 查看衝突版本軟件 rpm -qa | grep redhat-lsb-core rpm -qa | grep postfix rpm -qa | grep mariadb # 卸載衝突版本軟件 rpm -ev redhat-lsb-core-4.1-27.el7.centos.1.x86_64 rpm -ev postfix-2.10.1-6.el7.x86_64 rpm -ev mariadb-libs-5.5.56-2.el7.x86_64 # 安裝依賴 yum install -y net-tools yum install -y libaio # 安裝rpm,必定要按照順序安裝,遇到問題必定要查詢問題,不可直接繼續安裝 rpm -ivh mysql-community-common-5.7.21-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-5.7.21-1.el7.x86_64.rpm rpm -ivh mysql-community-client-5.7.21-1.el7.x86_64.rpm rpm -ivh mysql-community-server-5.7.21-1.el7.x86_64.rpm # 啓動mysql systemctl start mysqld # 查看初始用戶密碼 grep password /var/log/mysqld.log # 使用mysql帳戶登陸,修改初始化密碼 mysql -p # 輸入查看的密碼 set password = password("Yingtong@2018!"); # 容許root用戶遠程鏈接 grant all privileges on *.* to root@'%' identified by 'Yingtong@2018!'; flush privileges; # 修改區分大小寫的配置 vim /etc/my.cnf # 底部加入配置 lower_case_table_names=1 # 從新啓動mysql systemctl restart mysqld # 使用客戶端工具鏈接服務器
# 編輯,並使用:wq保存 vim /etc/my.cnf # 中止mysql systemctl stop mysql # 啓動mysql systemctl start mysql # 若是啓動遇到問題可有能夠查看mysql啓動日誌,以及systemctl 啓動日誌 # mysql日誌 tailf /var/log/mysqld.log # 系統日誌 journalctl -xe
配置:/etc/my.cnf配置修改內容(主數據庫)vim
# 添加serverid,注意必須與從數據庫不相同 server-id=2 # 開啓mysql-bin日誌,使用默認數據目錄:/var/lib/mysql/,使用其餘目錄會有問題 log-bin=/var/lib/mysql/mysql-bin # 開始mysql-replay-bin日誌,使用默認數據目錄 relay_log = /var/lib/mysql/relay-bin # 不區分大小寫,項目中有些庫使用大寫區分,因此服務器上添加這個設定 lower_case_table_names=1
主數據庫:centos
# 登陸主數據庫服務器,輸入密碼進行登陸 mysql -p # 建立同步帳號,ip地址爲從數據庫ip地址,密碼自行定義 GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO repl@'172.16.48.131' IDENTIFIED BY 'Repl@2018!'; # 使用戶生效 FLUSH PRIVILEGES;
從數據庫:服務器
# 使用mysql登陸 mysql -urepl -h172.16.48.129 -pRepl@2018! # 測試鏈接狀況,成功鏈接上,說明建立的同步帳號沒有問題
主數據庫;架構
# 鏈接主數據庫 mysql -p # 鎖定數據庫 flush tables with read lock; # 查詢主數據庫信息,記錄bin-log文件和座標 show master status; | File | Position | +------------------+----------+ | mysql-bin.000007 | 154
主數據庫;app
# 建立備份文件夾目錄 mkdir -p /app/mysqlbackup/ # 備份出文件,數據量小的狀況 mysqldump -uroot -p'Yingtong@2018!' -S /var/lib/mysql/mysql.sock --all-databases > /app/mysqlbackup/mysql_bak.$(date +%F).sql # 備份出文件,數據量大的狀況 mysqldump -uroot -p'Yingtong@2018!' -S /var/lib/mysql/mysql.sock --all-databases | gzip > /app/mysqlbackup/mysql_bak.$(date +%F).sql.gz # 從數據庫可使用scp命令進行拷貝 scp -r root@172.16.48.129:/app/mysqlbackup/mysql_bak.2018-10-21.sql /app/mysqlbackup/
導入數據庫配置ide
# 將備份數據導入從服務器 mysql -uroot -p'Yingtong@2018!' -S /var/lib/mysql/mysql.sock < /app/mysqlbackup/mysql_bak.2018-10-21.sql # 修改從服務器數據庫配置 vim /etc/my.cnf # 從新啓動數據庫 systemctl stop mysqld systemctl start mysqld
配置:/etc/my.cnf配置修改內容(從數據庫)
# 服務id server-id=1 # 開啓mysql-binlog日誌 log_bin = /var/lib/mysql/mysql-bin # 開始mysql-relay日誌 relay_log = /var/lib/mysql/relay-bin # 設定日誌的格式化 binlog-format = row # 設定從庫的日誌更新 log-slave-updates = true # 設定只讀 read_only = 1 # 設定數據庫不區分大小寫 lower_case_table_names = 1
# 從數據庫登陸mysql mysql -p # 設定同步帳號,輸入前面步驟中的mysql的mysql-bin.000007,和座標154 CHANGE MASTER TO MASTER_HOST='172.16.48.129', MASTER_USER='repl', MASTER_PASSWORD='Repl@2018!', MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=154 # 開啓同步 start slave; # 查看同步狀態:其中Slave_IO_Running: YES且Slave_SQL_Running: YES即爲成功同步了 show slave status \G
# 主數據庫 mysql -p # 解除鎖定 unlock tables;
# 中止數據庫同步 stop salve; # 中止同步線程 STOP SLAVE IO_THREAD