mysql互為主從環(huán)境介紹:
系統(tǒng):centos6.5_64_mini
mysql版本:mysql-5.6.19
實驗節(jié)點如下:
節(jié)點一:192.168.100.21
節(jié)點二:192.168.100.22
第一部分安裝需要用到的庫并刪除自帶mysql (節(jié)點一和二)
# yum -y install gcc gcc-c++ ncurses ncurses-devel openssl openssl-devel cmake perl lsof wget bison
# rpm -qa|grep mysql
# rpm -e --allmatches --nodeps mysql-libs-5.1.71-1.el6.x86_64
第二部分MYSQL的安裝(節(jié)點一和二)
1:創(chuàng)建MySQL數(shù)據(jù)庫存放目錄、配置用戶和用戶組
# /usr/sbin/groupadd mysql
# /usr/sbin/useradd -s /sbin/nologin -M -g mysql mysql
# mkdir -p /yunwei8/mysql/data/
# chown -R mysql:mysql /yunwei8/mysql/
2:創(chuàng)建軟件下載目錄,把所需軟件下載
# mkdir /yunwei8/soft
# cd /yunwei8/soft
# wget http://down.yunwei8.com/soft/linux/mysql-5.6.19.tar.gz
# wget http://down.yunwei8.com/soft/linux/libunwind-1.1.tar.gz
# wget http://down.yunwei8.com/soft/linux/gperftools-2.2.tar.gz
3:安裝mysql-5.6.19
# tar zxvf mysql-5.6.19.tar.gz
# cd mysql-5.6.19
# cmake -DCMAKE_INSTALL_PREFIX=/yunwei8/server/mysql -DMYSQL_DATADIR=/yunwei8/mysql/data -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DSYSCONFDIR=/etc/ -DWITH_SSL=yes -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_READLINE=on
# make
# make install
# chmod +w /yunwei8/server/mysql
# chown -R mysql:mysql /yunwei8/server/mysql/
4:創(chuàng)建軟連接
# ln -s /yunwei8/server/mysql/lib/lib* /usr/lib/
5:創(chuàng)建my.cnf配置文件,并修改:
設(shè)置Mysql
# cp /yunwei8/server/mysql/support-files/my-default.cnf /etc/my.cnf
# vi /etc/my.cnf
在[mysqld]下添如下行
character-set-server = utf8
default-storage-engine = MyISAM
basedir = /yunwei8/server/mysql
datadir = /yunwei8/mysql/data
log-error = /yunwei8/mysql/mysql_error.log
pid-file = /yunwei8/mysql/mysql.pid
max_allowed_packet = 32M
explicit_defaults_for_timestamp = true
6:以mysql用戶賬號的身份建立數(shù)據(jù)表:
# /yunwei8/server/mysql/scripts/mysql_install_db --basedir=/yunwei8/server/mysql --datadir=/yunwei8/mysql/data --user=mysql
7:設(shè)置mysql開機(jī)自動啟動服務(wù)
# cp /yunwei8/server/mysql/support-files/mysql.server /etc/init.d/mysqld
# chkconfig --add mysqld
# chkconfig --level 345 mysqld on
8:修改服務(wù)配置文件
# vi /etc/init.d/mysqld
根據(jù)設(shè)定需要,修改mysqld文件中的下面兩項
basedir=/yunwei8/server/mysql
datadir=/yunwei8/mysql/data
9:啟動mysqld服務(wù)
# service mysqld start
10:通過命令行登錄管理MySQL服務(wù)器并設(shè)置root密碼(提示輸入密碼時直接回車):(節(jié)點一和二)
# /yunwei8/server/mysql/bin/mysql -u root -p -S /tmp/mysql.sock
# mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('000000');
退出mysql
# mysql> exit
11:軟連接mysql
# ln -s /yunwei8/server/mysql/bin/mysql /usr/bin
12:嘗試用root連接mysql
# mysql -u root -p
成功登錄后查看狀態(tài)
# mysql> status;
第三部分:mysql優(yōu)化(節(jié)點一和二)
為MySQL添加TCMalloc庫的安裝步驟(Linux環(huán)境):
1:64位操作系統(tǒng)請先安裝libunwind庫,32位操作系統(tǒng)不要安裝。libunwind庫為基于64位CPU和操作系統(tǒng)的程序提供了基本的堆棧輾轉(zhuǎn)開解功能,其中包括用于輸出堆棧跟蹤的API、用于以編程方式輾轉(zhuǎn)開解堆棧的API以及支持C++異常處理機(jī)制的API。
首先安裝libunwind-1.1
# cd /yunwei8/soft
# tar zxvf libunwind-1.1.tar.gz
# cd libunwind-1.1
# CFLAGS=-fPIC ./configure
# make CFLAGS=-fPIC
# make CFLAGS=-fPIC install
2:安裝google-perftools:
# cd /yunwei8/soft
# tar zxvf gperftools-2.2.tar.gz
# cd gperftools-2.2/
# ./configure
# make && make install
# echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
# /sbin/ldconfig
3:修改MySQL啟動腳本(根據(jù)你的MySQL安裝位置而定)
# vi /yunwei8/server/mysql/bin/mysqld_safe
在# executing mysqld_safe的下一行,加上:
export LD_PRELOAD=/usr/local/lib/libtcmalloc.so
保存后退出,然后重啟MySQL服務(wù)器。
# service mysqld restart
4:使用lsof命令查看tcmalloc是否起效:
# /usr/sbin/lsof -n | grep tcmalloc
如果發(fā)現(xiàn)以下信息,說明tcmalloc已經(jīng)起效:
mysqld 11227 mysql mem REG 8,1 2171746 18287 /usr/local/lib/libtcmalloc.so.4.1.2
第四部分:mysql互為主從配置
第一步防火墻設(shè)置(節(jié)點一和二)
端口開放
# /sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
然后保存:
# /etc/rc.d/init.d/iptables save
第二步配置mysql互為主從
1:登錄mysql數(shù)據(jù)庫(節(jié)點一和二)
# mysql-u root -p
2:建立需要同步的數(shù)據(jù)庫(節(jié)點一和二)
# mysql> create database yunwei8;
3:添加一個遠(yuǎn)程用戶,名為yunwei8密碼為123456,并且只能對yunwei8數(shù)據(jù)庫有權(quán)限(節(jié)點一和二)
# mysql> GRANT ALL PRIVILEGES ON yunwei8.* TO yunwei8@"%" IDENTIFIED BY '123456';
4:修改/etc/my.cnf文件(節(jié)點一)
# rm -rf /etc/my.cnf
# vi /etc/my.cnf
添加如下配置代碼
[client]
default-character-set = utf8
port = 3306
socket = /tmp/mysql.sock
[mysqld]
character-set-server = utf8
default-storage-engine = MyISAM
basedir = /yunwei8/server/mysql
datadir = /yunwei8/mysql/data
log-error = /yunwei8/mysql/mysql_error.log
pid-file = /yunwei8/mysql/mysql.pid
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 32M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
thread_concurrency = 8
log-bin=mysql-bin
server-id = 1
binlog-do-db=yunwei8
replicate-do-db=yunwei8
binlog-ignore-db=mysql
replicate-ignore-db=mysql
sync_binlog=1
auto_increment_increment = 2
auto_increment_offset = 1
log-slave-updates
slave-skip-errors=all
[mysqldump]
quick
max_allowed_packet = 32M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
5:修改/etc/my.cnf文件(節(jié)點二)
# rm -rf /etc/my.cnf
# vi /etc/my.cnf
添加如下配置代碼
[client]
default-character-set = utf8
port = 3306
socket = /tmp/mysql.sock
[mysqld]
character-set-server = utf8
default-storage-engine = MyISAM
basedir = /yunwei8/server/mysql
datadir = /yunwei8/mysql/data
log-error = /yunwei8/mysql/mysql_error.log
pid-file = /yunwei8/mysql/mysql.pid
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 32M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
thread_concurrency = 8
log-bin=mysql-bin
server-id = 2
binlog-do-db=yunwei8
replicate-do-db=yunwei8
binlog-ignore-db=mysql
replicate-ignore-db=mysql
sync_binlog=1
auto_increment_offset = 2
auto_increment_increment = 2
log-slave-updates
slave-skip-errors=all
[mysqldump]
quick
max_allowed_packet = 32M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
6:重啟兩臺服務(wù)器的mysql(節(jié)點一和二)
# service mysqld restart
7:給兩個節(jié)點授權(quán)同步賬戶, 賦予REPLICATION SLAVE權(quán)限(節(jié)點一和二)
# mysql -u root -p
# mysql> GRANT REPLICATION SLAVE ON *.* to 'abc'@'%' identified by 'abc';
為abc用戶賦予任何數(shù)據(jù)庫中任何表上的REPLICATION SLAVE權(quán)限, 此用戶可以在網(wǎng)絡(luò)任意位置訪問, 訪問時以密碼abc標(biāo)記
8:開啟一個權(quán)限跟ROOT一樣的遠(yuǎn)程賬戶用于后期腳本監(jiān)控(節(jié)點一和二)
# GRANT ALL PRIVILEGES ON *.* TO admin@"%" IDENTIFIED BY '123456';
9:鎖表(鎖表狀態(tài)下不能退出SSH,否則會失敗,使用SSH可以另外克隆一個)(節(jié)點一和二)
# mysql -u root -p
# mysql> FLUSH TABLES WITH READ LOCK;
10:查看節(jié)點一狀態(tài)(記錄二進(jìn)制開始文件,位置)
# mysql> show master status;
顯示:
# mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 1051 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
11:查看節(jié)點二狀態(tài)(記錄二進(jìn)制開始文件,位置)
# mysql> show master status;
顯示:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 764 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
12:節(jié)點一連接節(jié)點二
# mysql> CHANGE MASTER TO MASTER_HOST='192.168.100.22',MASTER_USER='abc', MASTER_PASSWORD='abc',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=764;
12.1:開啟節(jié)點一同步進(jìn)程
# mysql> START SLAVE;
12.2:查看節(jié)點一同步狀態(tài)是否正常
# mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
……………………(省略部分)
Slave_IO_Running: Yes //此狀態(tài)必須YES
Slave_SQL_Running: Yes //此狀態(tài)必須YES
……………………(省略部分)
注:Slave_IO及Slave_SQL進(jìn)程必須正常運(yùn)行,即YES狀態(tài),否則都是錯誤的狀態(tài)(如:其中一個NO均屬錯誤)。
13:節(jié)點二連接節(jié)點一
# mysql> CHANGE MASTER TO MASTER_HOST='192.168.100.21',MASTER_USER='abc', MASTER_PASSWORD='abc',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=1051;
13.1開啟節(jié)點二同步進(jìn)程
# mysql> START SLAVE;
13.2查看節(jié)點二同步狀態(tài)是否正常
# mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
……………………(省略部分)
Slave_IO_Running: Yes //此狀態(tài)必須YES
Slave_SQL_Running: Yes //此狀態(tài)必須YES
……………………(省略部分)
注:Slave_IO及Slave_SQL進(jìn)程必須正常運(yùn)行,即YES狀態(tài),否則都是錯誤的狀態(tài)(如:其中一個NO均屬錯誤)。
14:解鎖節(jié)點一和節(jié)點二
# mysql> UNLOCK TABLES;
15:退出節(jié)點一和節(jié)點二的mysql,至此mysql的互為主從已經(jīng)實現(xiàn)了
# mysql> exit;
第五部分:mysql配置文件詳解
[client]
#設(shè)置mysql客戶端默認(rèn)字符集
default-character-set = utf8
#指定默認(rèn)端口
port = 3306
#是個UNIX域socket文件,這種socket效率比基于TCP/IP的socket高,但是缺點是不能跨機(jī)器連接,mysql提供這個東西是為了改善本地連接的速度
socket = /tmp/mysql.sock
[mysqld]
#服務(wù)端使用的字符集
character-set-server = utf8
#創(chuàng)建新表時將使用的默認(rèn)存儲引擎
default-storage-engine = MyISAM
#基準(zhǔn)路徑,其他路徑都相對于這個路徑
basedir = /yunwi8/server/mysql
# mysql數(shù)據(jù)庫文件所在目錄
datadir = /yunwei8/mysql/data
#錯誤日志存放路徑
log-error = /yunwei8/mysql/mysql_error.log
#進(jìn)程存放位置
pid-file = /yunwei8/mysql/mysql.pid
port = 3306
socket = /tmp/mysql.sock
#不使用系統(tǒng)鎖定,要使用myisamchk,必須關(guān)閉服務(wù)器
skip-external-locking
#myisam索引buffer,只有key沒有data
key_buffer_size = 384M
#增長到max_allowed_packet字節(jié)
max_allowed_packet = 32M
#主要用于設(shè)置table高速緩存的數(shù)量
table_open_cache = 512
#排序buffer大?。痪€程級別
sort_buffer_size = 2M
#以全表掃描(Sequential Scan)方式掃描數(shù)據(jù)的buffer大小 ;線程級別
read_buffer_size = 2M
#MyISAM以索引掃描(Random Scan)方式掃描數(shù)據(jù)的buffer大小 ;線程級別
read_rnd_buffer_size = 8M
#MyISAM 設(shè)置恢復(fù)表之時使用的緩沖區(qū)的尺寸,當(dāng)在REPAIR TABLE或用CREATE INDEX創(chuàng)建索引或ALTER TABLE過程中排序 MyISAM索引分配的緩沖區(qū)
myisam_sort_buffer_size = 64M
#線程緩存
thread_cache_size = 8
#查詢緩存大小
query_cache_size = 32M
#同時運(yùn)行的線程的數(shù)據(jù) 此處最好為CPU個數(shù)兩倍。本機(jī)配置為CPU的個數(shù)
thread_concurrency = 8
#以下為互為主從配置選項
#啟用二進(jìn)制日志
log-bin=mysql-bin
#表示是本機(jī)的序號為1,一般來講就是master的意思。
server-id = 1
#要記錄日志的數(shù)據(jù)庫,如果需要多個重復(fù)設(shè)置這個選項即可
binlog-do-db=yunwei8
#需要復(fù)制的數(shù)據(jù)庫名,如果需要多個數(shù)據(jù)庫,重復(fù)設(shè)置這個選項即可
replicate-do-db=yunwei8
#不要記錄日志的數(shù)據(jù)庫名,如果需要多個重復(fù)設(shè)置這個選項即可
binlog-ignore-db=mysql
#不需要復(fù)制的數(shù)據(jù)庫名,如果需要多個數(shù)據(jù)庫,重復(fù)設(shè)置這個選項即可
replicate-ignore-db=mysql
#默認(rèn)情況下,并不是每次寫入時都將binlog與硬盤同步。因此如果操作系統(tǒng)或機(jī)器(不僅僅是MySQL服務(wù)器)崩潰,有可能binlog中最后的語句丟失了。要想防止這種情況,你可以使用sync_binlog全局變量(1是最安全的值,但也是最慢的),使binlog在每N次binlog寫入后與硬盤同步。
sync_binlog=1
#字段一次遞增多少
auto_increment_increment = 2
#自增字段的起始值,這樣A的auto_increment字段產(chǎn)生的數(shù)值是:1, 3, 5, 7, …等奇數(shù)ID
auto_increment_offset = 1
#表示如果一個MASTER掛掉的話,另外一個馬上接管;一定要加上,否則不會把更新的記錄寫到二進(jìn)制文件里
log-slave-updates
#跳過錯誤,繼續(xù)執(zhí)行復(fù)制操作
slave-skip-errors=all
[mysqldump]
quick
max_allowed_packet = 32M
[mysql]
#這個配置段設(shè)置啟動MySQL服務(wù)的條件;在這種情況下,no-auto-rehash確保這個服務(wù)啟動得比較快。
no-auto-rehash