Ubuntu MySQL 修改數據庫路徑 及 主從複製
環境:
阿里雲 64位 Ubuntu Server 14
由於阿里雲Linux系統僅贈送20G系統盤,存放數據是遠遠不夠的。
額外購買一塊數據盤,掛載爲/mnt/xvdb1(用於存放MySQL數據)。掛載方式參考阿里雲官方文檔:
http://help.aliyun.com/knowledge_detail.htm?knowledgeId=5974154
缺省安裝mysql-server-5.5
apt-get install mysql-server
或安裝mysql-server-5.6
apt-get install mysql-server-5.6
〇、配置root從遠程訪問
vi /etc/mysql/my.cnf
#bind-address = 127.0.0.1
bind-address = 0.0.0.0
重新啓動mysql:
service mysql restart
mysql -u root -p
mysql>use mysql;
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'rootpassword' WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES;
一、先修改MySQL的數據存儲路徑
(從/var/lib/mysql到/mnt/xvdb1/database/var-lib-mysql):
停止mysql:
service mysql stop
mkdir /mnt/xvdb1/database
cp -r /var/lib/mysql /mnt/xvdb1/database/var-lib-mysql
chown -R mysql:mysql /mnt/xvdb1/database/var-lib-mysql
修改mysql配置(主從相同):(參考:http://www.linuxidc.com/Linux/2015-01/112587.htm)
vi /etc/mysql/my.cnf
[mysqld]
#datadir = /var/lib/mysql
datadir = /mnt/xvdb1/database/var-lib-mysql
vi /etc/apparmor.d/usr.sbin.mysqld
#/var/lib/mysql/ r,
#/var/lib/mysql/** rwk,
/mnt/xvdb1/database/var-lib-mysql/ r,
/mnt/xvdb1/database/var-lib-mysql/** rwk,
重啓apparmor和mysql,並檢查:
/etc/init.d/apparmor restart
service mysql start
mysql -uroot -p
mysql> show variables like '%dir%';
顯示 datadir 爲 /mnt/xvdb1/database/var-lib-mysql即可。
二、配置mysql主從複製
參考:https://www.centos.bz/2011/07/linux-mysql-replication-sync-configure/
http://xuwensong.elastos.org/2014/01/07/ubuntu-%E4%B8%8B-mysql-%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6%E5%8F%8Amysql-proxy-%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB/
假設:
主服務器內網IP:10.0.0.1
從服務器內網IP:10.0.0.2
主服務器需要將名稱爲mydb的數據庫實時複製到從服務器,用於備份或者讀寫分離的讀服務器。
創建數據庫及部分命令,我使用navicat for mysql,過程不表。
service stop msyql
主服務器:
vi /etc/mysql/my.cnf
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
bind-address = 0.0.0.0 #主服務器需要被從服務器通過網絡訪問
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
# my replication settings
server-id = 1 #主服務器id爲1#log_bin = /var/log/mysql/mysql-bin.log
# 特別注意:mysql複製所產生的binary日誌特別大,如果放在/var/log/mysql/目錄下會導致阿里雲缺省20G的系統盤空間迅速吃滿,並導致數據庫不可用
log_bin = /mnt/xvdb1/database/mysql_repl_log/mysql-bin.log
#innodb_flush_log_at_trx_commit = 1 #不明白,所以註釋了
sync_binlog = 1
expire_logs_days = 10
max_binlog_size = 100M
binlog_format = mixed
binlog_do_db = mydb #需要複製的數據庫名稱
binlog_ignore_db = mysql,information_schema,performance_schema #不需要複製的系統數據庫
注:binlog_format=mixed是爲了解決Hibernate異常:Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'
參考: https://confluence.atlassian.com/pages/viewpage.action?pageId=251724630
http://dba.stackexchange.com/questions/58459/mysql-error-impossible-to-write-to-binary-log
啓動mysql
service mysql start
mysql -uroot -p
mysql> CREATE USER 'repl'@'10.0.0.2' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.2' IDENTIFIED BY 'password';
mysql> show master status;
+------------------+----------+--------------+---------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+---------------------------------------------+
| mysql-bin.000007 | 15267 | mydb | mysql,information_schema,performance_schema |
+------------------+----------+--------------+---------------------------------------------+
1 row in set (0.00 sec)
從服務器
在開始配置從服務器前,需要將主服務器的數據庫mydb數據完整的導入從服務器,我使用navicat for mysql,右鍵單擊數據庫,選擇Data Transfer工具完成導入。
vi /etc/mysql/my.cnf
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
# my replication settings
server-id = 2 #從服務器id爲2#log_bin = /var/log/mysql/mysql-bin.log
# 特別注意:mysql複製所產生的binary日誌特別大,如果放在/var/log/mysql/目錄下會導致阿里雲缺省20G的系統盤空間迅速吃滿,並導致數據庫不可用
log_bin = /mnt/xvdb1/mysql_repl_log/mysql-bin.log
binlog_format = mixed
expire_logs_days = 10
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
mysql -uroot -p
mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.1',MASTER_USER='repl',MASTER_PASSWORD='password',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000007',MASTER_LOG_POS=15267,MASTER_CONNECT_RETRY=10;
特別注意:
此處的MASTER_LOG_FILE和MASTER_LOG_POS必須與主服務器查出來的值一致。由於忽略了此處,導致走了彎路。
從服務器一直報錯。參考:http://www.percona.com/blog/2014/05/14/max_allowed_packet-and-binary-log-corruption-in-mysql/
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master'
事實是MASTER_LOG_POS與主服務器不相符,而與max_allowed_packet無關。
當然,max_allowed_packet缺省值爲16M,根據實際需要改爲了32M.
mysql> start slave;
(關閉指令爲stop slave;)
mysql> show slave status\G;
如果Slave_IO_Running和Slave_SQL_Running的值同時爲Yes,則複製配置成功。否則需要查看 Last_Error 解決問題。
測試在主服務器寫入或修改數據,從服務器幾乎同步發生變化。
MySQL備份與恢復
mysqldump -uroot -p dbname > dbname.sql
mysqldump -uroot -p dbname --ignore-table=dbname.tablename > dbname.sql
mysql -uroot -p dbname < dbname.sql