Ubuntu MySQL 修改數據庫路徑 及 主從複製

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,過程不表。


還是先停止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)


注意:此處記住File和Postion


從服務器

在開始配置從服務器前,需要將主服務器的數據庫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

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備份與恢復

1、備份:
mysqldump -uroot -p dbname > dbname.sql

2、忽略某張表備份:
mysqldump -uroot -p dbname --ignore-table=dbname.tablename > dbname.sql

3、備份並gzip壓縮:
mysqldump -uroot -p dbname | gzip > dbname.sql.gz

4、恢復:
mysql -uroot -p dbname < dbname.sql

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章