mysql5.7 yum安裝及主從配置(從庫只讀),不重啟主庫新增從庫配置
yum -y remove mysql
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
yum -y install mysql-server
systemctl start mysqld
主從都要做:
mysql5.7.x版本後預設yum安裝會生成一個初始密碼
cat /var/log/mysqld.log |grep password
檢視初始密碼登入資料庫後修改密碼
ALTER USER USER() IDENTIFIED BY '新密碼';
flush privileges;
主庫操作:
修改主庫配置檔案
/etc/my.conf
[mysqld]下新增
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
server-id=2
log-bin=log
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
儲存重啟資料庫
systemctl restart mysql
進資料庫建立同步賬號
create user 'sync'@'%' identified by 'Sync!0000';
grant FILe on *.* to 'sync'@'192.168.0.145' identified by 'Sync!0000';
grant replication slave on *.* to 'sync'@'192.168.0.145' identified by 'Sync!0000';
flush privileges;
show master status; 記錄File和Position對應的資訊,我這裡是log.000006和151
從庫操作:
修改從庫配置檔案
[mysqld]下新增
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
server-id=3
log-bin=mysql-bin
replicate-ignore-db=mysql
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=sys
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60
read_only=1
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
儲存重啟資料庫
systemctl restart mysql
進入資料庫
stop slave;
change master to master_host='192.168.0.135',master_user='sync',master_password='Sync!0000',master_log_file='log.000003',master_log_pos=154; (最關鍵的一步,將主庫ip,同步賬號的使用者密碼,show master status得到的file、position寫入。在5.7之前的版本這一步的相關引數是寫到配置檔案中的,5.7如果再寫進配置檔案會報引數錯誤)
start slave;
show slave status \G;
read_only=1只讀模式,可以限定普通使用者進行資料修改的操作,但不會限定具有super許可權的使用者(如超級管理員root使用者)的資料修改操作。
如果想保證super使用者也不能寫操作,就可以就需要執行給所有的表加讀鎖的命令 “flush tables with read lock;”。(但是退出mysql程序後 該配置就失效了 root賬號繼續可以寫入,一般遷移時用到)
GRANT select,insert,update,delete ON *.* TO '普通賬號'@'%' IDENTIFIED BY '密碼' ; 給從庫建立一個普通賬號有增刪改查的許可權
用這個賬號連線從庫進行新增資料或者刪除資料或者update資料都會失敗。
必須用 指定部分許可權的普通使用者才行, 不能給ALL許可權,否則就不能做到只讀。
還有不能在末尾加WITH GRANT OPTION,如果加了 可能可以自己給自己加ALL許可權。以防萬一不加
至此主庫讀寫,從庫同步+只讀完成
(若root賬號需要遠端連線則GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youpassword' ;
FLUSH PRIVILEGES; 允許任何IP訪問)
不重啟主庫的情況下新增從庫
xtrabackup需要yum安裝該軟體
xtrabackup是物理備份,備份速度快,不鎖表。為什麼不鎖表?因為自身會監控主庫日誌,如果有更新的資料,就會先寫到一個檔案中,然後再回歸到備份檔案中,從而保持資料一致性。
centos7下
先主庫安裝xtra的倉庫
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm
再裝2.4.12的最新版本包
yum install percona-xtrabackup-24
(mysql5.7以上需要2.4以上的xtra,如有更新下載最新的xtra)
新建一個專用備份的目錄
mkdir /mysqlbackup
cd /mysqlbackup
備份到該目錄
innobackupex --user=root --password=密碼 ./
拷貝目錄所有檔案到新增的從庫伺服器
scp -r 2018-11-27_08-20-19/ [email protected]:/root/
從庫操作
先按照上文修改從庫預設密碼,再改從庫配置檔案注意server-id要不同
再停服務,刪datadir(別跑路),把備份改為datadir,賦許可權,重啟服務
systemctl stop mysqld
rm -rf /var/lib/mysql
mv 2018-11-27_08-20-19/ /var/lib/mysql
chown mysql.mysql -R /var/lib/mysql
systemctl start mysqld
這回用主庫賬號進去檢視(如果主庫有%遠端訪問許可權,記得改掉,一會重開只讀賬號),發現主庫的庫都在 就是成功了。
再去主庫建立一張新表隨便添點資料(模擬備份後新增資料)
從備份目錄中xtrabackup_info檔案獲取到binlog和pos位置
cat /var/lib/mysql/xtrabackup_info
進入資料庫同步主庫 填入xtrabackup_info的binlog檔名和pos值
stop slave;
change master to master_host='192.168.0.135',master_user='sync',master_password='Sync!0000',master_log_file='log.000003',master_log_pos=1872;
啟動同步前需要在主庫上允許這個新從庫IP訪問
grant FILe on *.* to 'sync'@'192.168.0.141' identified by 'Sync!0000';
grant replication slave on *.* to 'sync'@'192.168.0.141' identified by 'Sync!0000';
flush privileges;
再到從庫開啟同步
start slave;
檢視是否成功
show slave status\G;
成功後新增從庫已經把備份後產生的表都同步過來了
但是還沒完,至此從庫的賬號許可權和主庫是一樣的(雖然從庫同步排除了mysql庫,但是xtra是物理備份了主庫所有檔案),如果從庫要做成只讀就必須要新開個只讀賬號。參照上文