目前有個需求,希望把公司的多個mysql數據庫備份,有一臺服務器存儲比較大,計劃把其他的mysql備份到這上面,一開始計劃使用dump回傳,後來發現有些庫數據比較大,因此使用master-slave,即多主一叢。
1 先在備份服務器安裝mysql,開啓mysqlmulti模式,配置my.cnf
[mysqld_multi]
mysqld=/usr/bin/mysqld_safe
mysqladmin=/usr/bin/mysqladmin
user = ‘your_user’
password=‘your_password’
log=/home/mysql/log/multi.log
[client]
#password = your_password
[mysqld1]
#主庫1
port = 3306
socket=/tmp/mysql1.sock
pid-file=/home/mysql/mysqldata1/mysql1.pid
datadir=/home/mysql/mysqldata1
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci
#(注意linux下mysql安裝完後是默認:表名區分大小寫,列名不區分大小寫; 0:區分大小寫,1:不區分大小寫)
lower_case_table_names=1
max_connections=1000
server-id = 1
#要備份的庫
replicate-do-db = mysql1
slave_skip_errors= 1158 1159 1008 1007 1062 1452
#slave_skip_errors= all
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysqld2]
#主庫2
port = 3307
socket=/tmp/mysql2.sock
pid-file=/home/mysql/mysqldata2/mysql2.pid
datadir=/home/mysql/mysqldata2
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci
#(注意linux下mysql安裝完後是默認:表名區分大小寫,列名不區分大小寫; 0:區分大小寫,1:不區分大小寫)
lower_case_table_names=1
max_connections=1000
server-id = 2
#要備份的庫
replicate-do-db = mysql2
slave_skip_errors=1158 1159 1008 1007 1062 1452
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_size= 268435456
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
2 啓動關閉數據庫,my.cnf配置好,啓動時會自動創建文件和庫文件,注意賬號權限。
mysqld_multi start 1
mysqld_multi stop 1
mysqld_multi start 2
mysqld_multi stop 2
3 設置各數據的密碼
/usr/bin/mysqladmin -u root password 'you_password' -S /tmp/mysql1.sock
/usr/bin/mysqladmin -u root password 'you_password' -S /tmp/mysql2.sock
測試能關閉啓動數據庫,密碼能進入
4 各主庫設置同步賬號,注意授權和同步庫,我這裏是全部同步,偷懶全部授權了莫學。
grant all privileges on *.* to 'your_user'@'%' identified by 'you_password';
5主庫要開log-bin,即在主庫my.cnf增加重啓,開過這步可省略
server-id=219 #主庫和備庫id不能重複
log-bin=mysql-bin
expire_logs_days=8
6 導出備份庫,具體參數含義百度吧,我這裏就不詳細介紹了
mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 mysql1 > mysql1.sql
mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 mysql2 > mysql2.sql
查看主庫導出的事務位置,即找到CHANGE MASTER這行
head -22 mysql1.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=120;
head -22 mysql2.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=147774;
7 將導出文件傳到備庫並導入,導入前要創建數據庫名
mysql -S /tmp/mysql1.sock -uroot -p mysql1 < /root/mysql1.sql
mysql -S /tmp/mysql1.sock -uroot -p mysql2 < /root/mysql2.sql
8 導入成功後,在備庫啓用同步,注意MASTER_LOG_FILE和 MASTER_LOG_POS和第6步有關係
change master to master_user='you_user',master_password='your_password',master_host='your_host',master_port=your_port,
MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=120;
change master to master_user='you_user',master_password='your_password',master_host='your_host',master_port=your_port,
MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=147774;
start slave;
show slave status\G; 查看同步狀態
至此兩主一叢基本完成,中間若出現問題根據問題報錯解決,mysql相對來說上手還是比較簡單,網上各種問題的介紹也比較多,大家可以參考。