1. 程式人生 > 其它 >Centos7.5 MySQL雙主複製

Centos7.5 MySQL雙主複製

官方網站:https://mysql-mmm.org/mmm2_guide.html

安裝mysql

mysql倉庫:https://repo.mysql.com/

獲取rpm包

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

安裝rpm包

sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm

安裝mysql服務

sudo yum install mysql-server

登陸mysql更改密碼

mysql -u root -p

報錯

Can't connect to local MySQL server through socket 
'/var/lib/mysql/mysql.sock'

更改使用者組許可權,問題解決

chown -R root /var/lib/mysql/

登入更改使用者密碼

mysql -u root -p

預設密碼應該是root,切換到mysql資料庫,然後更改密碼

use mysql;
update user set password=PASSWORD("your password") where user='root';

遠端訪問賦權

GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "your password";

master1的基本配置

修改my.cnf

vim /etc/my.cnf

在[mysqld]結點下新增以下內容,而不是[mysqld_safe]結點

server_id           = 1
log_bin             = /var/log/mysql/mysql-bin.log 
log_bin_index       = /var/log/mysql/mysql-bin.log.index 
relay_log           = /var/log/mysql/mysql-relay-bin 
relay_log_index     = /var/log/mysql/mysql-relay-bin.index 
expire_logs_days    
= 10 max_binlog_size = 100M log_slave_updates = 1

另外,移除這一行

bind-address = 127.0.0.1

接著新增下面這三行

# 遞增步長
auto_increment_increment = 1
# 起始偏移
auto_increment_offset = 1
# 用0.0.0.0代替任何ip
bind-address = 0.0.0.0

然後重啟mysql

service mysqld restart

重啟mysql卡住

[root@VM-0-12-centos log]# service mysqld restart;
Redirecting to /bin/systemctl restart mysqld.service

檢視一下mysql日誌

cat /var/log/mysqld.log 

翻到啟動mysql的時間點檢視

可以看到指定的檔案 /var/log/mysql/mysql-bin.log.index 找不到,這個檔案有在my.cnf中配置,盲猜許可權問題

檢視一下使用者組和使用者

cut -d : -f 1 /etc/group
cut -d : -f 1 /etc/passwd

能看到mysql組和mysql使用者,更改一下建立配置資料夾餅更改的使用者所有者

mkdir /var/log/mysql
chown mysql.mysql /var/log/mysql

然後重啟mysql服務,啟動成功,然後檢視一下master的status

建立使用者

GRANT REPLICATION CLIENT                 ON *.* TO 'mmm_monitor'@'ip' IDENTIFIED BY 'monitor_password';
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'ip'   IDENTIFIED BY 'agent_password';
GRANT REPLICATION SLAVE                  ON *.* TO 'replication'@'ip' IDENTIFIED BY 'replication_password';

資料庫之間的資料同步

開啟一個終端登入mysql,然後上鎖確保資料庫不會被修改

FLUSH TABLES WITH READ LOCK;

開啟另一個終端,檢視master status,記錄下file和position

匯出當前資料庫的備份

mysqldump -u root -p --all-databases > /tmp/database-backup.sql

把sql檔案匯入到伺服器

scp /tmp/database-backup.sql <user>@ip:/tmp

在其他伺服器上到人檔案

mysql -u root -p < /tmp/database-backup.sql

登陸mysql然後重新整理

FLUSH PRIVILEGES;

配置主從

繼續在其他伺服器上登陸mysql,執行下面指令

CHANGE MASTER TO master_host='192.168.0.11', master_port=3306, master_user='replication', master_password='replication_password', master_log_file='<file>', master_log_pos=<position>;

這裡的master_log_file和master_log_pos都是上面show master status記錄下來值

修改完後,在mysql終端啟動slave

START SLAVE;

參考指令碼

安裝 MySQL

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
sudo yum -y  install mysql-server
chown -R root /var/lib/mysql/
chmod -R 777 /var/lib/mysql/
if [ ! -d "/var/log/mysql" ]; then
    mkdir /var/log/mysql
fi
chown mysql.mysql /var/log/mysql
myconf=$(cat<< EOF
skip-grant-tables\nserver_id           = $1\nlog_bin             = \/var\/log\/mysql\/mysql\-bin.log\nlog_bin_index       = \/var\/log\/mysql\/mysql\-bin.log.index\nrelay_log           = \/var\/log\/mysql\/mysql\-relay\-bin\nrelay_log_index     = \/var\/log\/mysql\/mysql\-relay\-bin.index\nexpire_logs_days    = 10\nmax_binlog_size     = 100M\nlog_slave_updates   = 1\nauto_increment_increment = 1\nauto_increment_offset = 1\nbind\-address = 0.0.0.0
EOF
)
echo $myconf
sed -i "/\[mysqld\]/a$myconf" /etc/my.cnf
service mysqld restart
mysql -e"use mysql;update user set password=PASSWORD(\"密碼\") where user='root';"
sed -i '/skip-grant-tables/d' /etc/my.cnf
service mysqld restart
mysql -uroot -p密碼 -e"GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密碼';GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'%' IDENTIFIED BY '密碼';GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'%' IDENTIFIED BY '密碼';GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%' IDENTIFIED BY '密碼';flush privileges;"

配置主從

#檢視master表
master_status=`mysql -h $1 -uroot -p密碼 -e "show master status;"`
#列印master表
echo "$master_status"
file=`echo "$master_status" | grep "bin" | awk '{print $1}'`
echo "$file"
pos=`echo "$master_status" | grep "bin" | awk '{print $2}'`
echo "$pos"
mysql -h $2 -uroot -pReborn2020 -e "stop slave;"
mysql -h $2 -uroot -pReborn2020 -e "change master to master_host='$1',master_user='replication',master_password='Reborn2020',master_log_file='$file',master_log_pos=$pos;"
mysql -h $2 -uroot -pReborn2020 -e "start slave;"

匯入表

mysql -uroot -p密碼 < /tmp/database-backup.sql
mysql -uroot -p密碼 -e "flush privileges;"

最後效果,雙主中任意一個新增、修改資料,其他三臺機器都會相應改動

論讀書
睜開眼,書在面前
閉上眼,書在心裡