MySQL主從複製也稱主從同步,他是構建數據庫高可用集羣架構的基礎,將一臺主機的數據複製到多臺主機,並從新應用日誌中的SQL語句實現複製功能mysql
MySQL支持單向,雙向,鏈式級聯,異步複製linux
5.5版本新增半同步複製 5.6新增GTID複製 5.7新增多源複製/並行複製/loss-less複製,複製過程當中,一臺服務器充當主庫,另外一個充當從庫sql
1) master------------->slave 單向主從數據庫
2) master <-----------> master 雙向主從服務器
3) master -------->slave1------>slave2 級聯主從網絡
4) master ------->slave 一主多從session
|--------------->slave2架構
5)master------------>slave 多主一從less
master--------------|^異步
主庫 :I/O-dump-thread
從庫:I/O-thread SQL-thread
從庫的I/O-thread向主庫請求binlog文件,主庫I/O-dump-thread響應寫入從庫的relaylog文件
從庫的SQL-thread從relaylog文件中讀取語句,轉成SQL語句,寫入從庫
log-bin 搭建主從複製,必須開啓二進制日誌
server-id :主從服務器的標識,主從服務器不能一致
server-uuid : mysql5.6 新增 ,數據庫啓動自動生成,保存在數據目錄下的auto.cnf中
read_only: 設置從庫爲只讀狀態 super_read_only: 全部帳號包括管理員都會禁止寫
binlog_format: 必須爲row
log_slave_updates: 獲取主服務器上的數據變動信息,寫到從服務器的二進制日誌中
binlog_error_action: 5.7新增 =ABORT_SERVER 不能寫binlog時,mysql會退出(默認)
=IGNORE_ERROR 不能寫入binlog時,關閉binlog功能,會致使主從出現數據庫數據不一致的狀況
binlog-do-db: (主庫) 選擇複製哪一個數據庫
binlog-ignore-db: 不復制哪一個數據庫
gtid_mode:決定是否開啓gtid模式
enforce-gtid-consistency: 開啓gtid模式,該參數也開啓
gtid_next: session級別的變量,下一個gtid,默認automatic
gtid_purged:丟掉的gtid
relay_log:記錄從庫的IO thread從主庫讀取來的binlog
replicate_do_table:(從庫) 複製指定表
replicate_ignore_table:(從庫) 不復制指定表
replicate_do_db:(從庫)只複製指定庫
replicate_ignore_db:(從庫) 不復制指定庫
replicate-wild-do-table:使用通配符複製指定表
replicate-wild-ignore-table:使用通配符不復制指定表
master-info-repository:=table 記錄主從狀態&配置
relay_log_info_repository:=table 記錄斌binlog應用位置記錄到relay.info中
relay_log_recovery:(從庫)(默認關閉)(建議開啓=1)
relay_log_purge:(從庫)(建議開啓)清除已執行的relaylog
slave_net_timeout :設置網絡超時時間點
並行複製參數:
slave_parallel_type='LOGICAL_CLOCK'
slave_parallel_workers = X 設置X線程執行relaylog中向主庫提交的事務
1)安裝MySQL
MYSQL_TAR=mysql tar包
tar zxvf $MYSQL_TAR -C /opt/
MYSQL=`echo $MYSQL_TAR | sed -r "s/.tar[.a-zA-Z0-9]+//g"`
mv /opt/${MYSQL} /opt/mysql
ln -s /opt/mysql /usr/local/mysql
mkdir -p /opt/mysql/data
groupadd mysql
useradd -r -g mysql mysql
rpm -qa | grep libaio > /dev/null
2)修改 /etc/my.cnf
cat > /etc/my.cnf << EOF
[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock
[mysqld_safe]
log-error=/usr/local/mysql/data/mysql_error
pid-file=/usr/local/mysql/data/`hostname`.pid
!includedir /etc/my.cnf.d
EOF
3)環境修改
chown -R mysql:mysql /usr/local/mysql
chown -R mysql:mysql /opt/mysql
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chmod 777 /etc/init.d/mysql
echo "export PATH=$PATH:/opt/mysql/bin" >> /etc/profile
source /etc/profile
4)重設密碼
service mysql stop 2>&1 > /dev/null
/opt/mysql/bin/mysqld_safe --user=mysql --skip-grant-tables > /opt/log &
sleep 3s
/opt/mysql/bin/mysql -u root << EOF
use mysql;
update user set authentication_string=password('123456') where user='root';
update user set password_expired='N' where user='root';
flush privileges;
EOF
#service mysql stop
pgrep mysqld | xargs kill -9
5)主修改
cat > /etc/my.cnf << EOF
[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock
server_id=101
log_bin=/usr/local/mysql/mysql-bin
[mysqld_safe]
log-error=/usr/local/mysql/data/mysql_error
pid-file=/usr/local/mysql/data/`hostname`.pid
!includedir /etc/my.cnf.d
EOF
6)自動登錄設置&建立同步用戶
service mysql stop
echo '[client]' >> /etc/my.cnf
echo 'host=localhost' >> /etc/my.cnf
echo "user=$MASTER_mysql_user" >> /etc/my.cnf
echo "password=$MASTER_mysql_pass" >> /etc/my.cnf
service mysql start
sleep 10s
mysql << EOF
grant replication slave ,replication client on *.* to user@'%' identified by '123456';
flush privileges;
EOF
7)防火牆設置
MySQL的PORT=3306
iptables -A INPUT -p tcp --dport $PORT -j ACCEPT
iptables -A OUTPUT -p tcp --dport $PORT -j ACCEPT
################setenforce
setsebool -P mysql_connect_any on
setsebool -P selinuxuser_mysql_connect_enabled on
8)檢查主狀態
mysql <<EOF > conf_master
show master status;
EOF
1)MySQL安裝
同上
2)從 /etc/my.cnf修改
cat > /etc/my.cnf << EOF
[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock
server_id=102
log_bin=/usr/local/mysql/mysql-bin.log
relay-log=/usr/local/mysql/mysql-relay-bin.log
#read_only=1
[mysqld_safe]
log-error=/usr/local/mysql/data/mysql_error
pid-file=/usr/local/mysql/data/`hostname`.pid
!includedir /etc/my.cnf.d
EOF
3)修改環境
同上
4)修改MySQL密碼
同上
5)設置自動登錄
同上
6)防火牆設置
同上
7)從MySQL設置
MASTER_LOG=`cat /opt/conf_master | grep mysql | cut -d ' ' -f1`
MASTER_POS=`cat /opt/conf_master | grep mysql | cut -d ' ' -f2`
conf_master 是主MySQL檢查狀態傳過來的文件
mysql << EOF
change master to master_host='$MASTER_IP',master_user='user',master_password='123456',master_log_file='${MASTER_LOG}',master_log_pos=${MASTER_POS};
flush privileges;
start slave;
EOF
8)檢查從MySQL狀態
mysql <<EOF > conf_slaveshow slave status\G;EOF