Mysql主從同步部署
概述sql
在從服務器能夠執行查詢工做,下降主服務器壓力。
在從主服務器進行備份,避免備份期間影響主服務器服務。
當主服務器出現問題時,能夠切換到從服務器。
複製過程當中一臺服務器充當主服務器,而一個或多個其它服務器充當從服務器。主服務器將更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌循環。這些日誌能夠記錄發送到從服務器的更新。當一個從服務器鏈接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生的任何更新,而後封鎖並等待主服務器通知新的更新。
Mysql使用3個線程來執行復制功能,其中兩個線程(Sql線程和IO線程)在從服務器,另一個線程(IO線程)在主服務器。當發出START SLAVE時,從服務器建立一個I/O線程,以鏈接主服務器並讓它發送記錄在其二進制日誌中的語句。主服務器建立一個線程將二進制日誌中的內容發送到從服務器。該線程能夠即爲主服務器上SHOW PROCESSLIST的輸出中的Binlog Dump線程。從服務器I/O線程讀取主服務器Binlog Dump線程發送的內容並將該數據拷貝到從服務器數據目錄中的本地文件中,即中繼日誌。第3個線程是SQL線程,由從服務器建立,用於讀取中繼日誌並執行日誌中包含的更新。在從服務器上,讀取和執行更新語句被分紅兩個獨立的任務。當從服務器啓動時,其I/O線程能夠很快地從主服務器索取全部二進制日誌內容,即便SQL線程執行更新的遠遠滯後。
主服務器:
IP地址:192.168.0.10 主機名稱:masterdb01
從服務器:
IP地址:192.168.0.11 主機名稱:slavedb02
[root@masterdb01 ~]# yum -y install gcc perl-DBI perl-DBD-MySQL unixODBC ncurses-devel
[root@masterdb01 ~]# tar xvf mysql-5.1.44.tar.gz -C /usr/local/src/
[root@masterdb01 ~]# cd /usr/local/src/mysql-5.1.44/
[root@masterdb01 ~]# useradd mysql -M -s /sbin/nologin
[root@masterdb01 mysql-5.1.44]# vim configure
註釋$RM "$cfgfile" 這一行(不然編譯時會報錯)
[root@masterdb01 mysql-5.1.44]# ./configure --prefix=/usr/local/mysql-5.1.44 --with-unix-socket-path=/usr/local/mysql-5.1.44/data/mysql.sock --localstatedir=/usr/local/mysql-5.1.44/data/ --without-debug --enable-thread-safe-client --enable-assembler --enable-profiling --enable-community-features --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static --with-extra-charsets=all --with-plugins=innobase --with-mysqld-user=mysql --without-embedded-server --with-server-suffix=-community
[root@masterdb01 mysql-5.1.44]# make
[root@masterdb01 mysql-5.1.44]# make install
[root@masterdb01 mysql-5.1.44]# chown -R root.mysql /usr/local/mysql-5.1.44/
[root@masterdb01 mysql-5.1.44]# ./scripts/mysql_install_db --user=mysql
[root@masterdb01 mysql-5.1.44]# cp support-files/my-medium.cnf /etc/my.cnf
[root@masterdb01 mysql-5.1.44]# chown -R mysql.mysql /usr/local/mysql-5.1.44/data/
[root@masterdb01 mysql-5.1.44]# cd /usr/local/mysql-5.1.44/libexec/
[root@masterdb01 libexec]# cp mysqld mysqld.old
[root@masterdb01 libexec]# strip mysqld
[root@masterdb01 libexec]# echo "/usr/local/mysql-5.1.44/lib/mysql/" >> /etc/ld.so.conf
[root@masterdb01 libexec]# ldconfig
[root@masterdb01 libexec]# /usr/local/mysql-5.1.44/bin/mysqld_safe &
[root@masterdb01 libexec]# /usr/local/mysql-5.1.44/bin/mysqladmin -u root password "redhat"
[root@masterdb01 libexec]# export PATH=$PATH:/usr/local/mysql-5.1.44/bin/
[root@masterdb01 libexec]# echo "export PATH=$PATH:/usr/local/mysql-5.1.44/bin/" >> /etc/profile
[root@masterdb01 libexec]# echo "/usr/local/mysql-5.1.44/bin/mysqld_safe &" >> /etc/rc.local
[root@masterdb01 libexec]# /usr/local/mysql-5.1.44/bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.44-community-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql>
到此mysql安裝完畢
注:上述配置主從機器都須要配置。
mysql> grant replication slave on *.* to 'replication'@'192.168.0.11' identified by 'replication';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
Slave上測試: mysql -h 192.168.0.10 -u replication -preplication
首先關閉數據庫在修改
[mysqld]
socket = /usr/local/mysql-5.1.44/data/mysql.sock
server-id = 1
log-bin=mysql-bin
binlog_format=mixed
Log-slave-updates
log = /var/log/mysql.log
log-error = /var/log/mysql_error.log
long_query_time = 2
log-slow-queries = /var/log/mysql_slow.log
log_queries_not_using_indexes
註釋以下三行
#log-bin=mysql-bin
#binlog_format=mixed
#server-id = 1
配置文件詳解:
server-id=1 表明主庫,2表明從庫 配置一個惟一的ID編號,編號範圍1-32
log-bin=mysql-bin 這個是必須的表示開啓二進制日誌計入。
bin-do-db=test 須要同步的數據庫,若是沒有本行 表示同步全部的數據庫。
binlog-ignore-db=test1 表示不須要同步的數據庫名。
log-slave-updates 這個參數必定要加上,不然不會給更新的記錄寫到二進制文件裏(不打開也能夠,只是開了之後你能夠在從上時時日誌恢復)。
expire_logs_days=5 (爲避免日誌文件過大,設置過時時間爲5天超過5天自動刪除,通常生產系統設置爲0) 。
slave-skip-errors 跳過錯誤,繼續執行復制操做。
重啓mysql
[root@masterdb01 ~]# mysqladmin shutdown -u root -predhat
[root@masterdb01 ~]# /usr/local/mysql-5.1.44/bin/mysqld_safe &
啓動時報錯
mysqld_safe mysqld from pid file /usr/local/mysql-5.1.44/data/masterdb01.pid ended
[root@masterdb01 ~]# mysql -u root -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/usr/local/mysql-5.1.44/data/mysql.sock' (2)
問題解決
原來是mysql用戶和權限的問題,重建mysql用戶從新修改權限
[root@masterdb01 ~]# useradd mysql -M -s /sbin/nologin
[root@masterdb01 ~]# chown -R root.mysql /usr/local/mysql-5.1.44/
[root@masterdb01 ~]# chown -R mysql.mysql /usr/local/mysql-5.1.44/data/
再重新啓動mysql ok問題解決
Mysql啓動時能夠查看日誌有沒有報錯
[root@masterdb01 ~]# tailf /usr/local/mysql-5.1.44/data/masterdb01.err
第一次同步以前,確保兩邊的數據是同步的。
拷貝時首先須要關閉mysql數據庫。
首先關閉數據庫在修改
[root@slavedb02 ~]# vim /etc/my.cnf
socket = /usr/local/mysql-5.1.44/data/mysql.sock
server-id = 2
log-bin=mysql-bin
binlog_format=mixed
log-slave-updates
log = /var/log/mysql.log
log-error = /var/log/mysql_error.log
long_query_time = 2
log-slow-queries = /var/log/mysql_slow.log
log_queries_not_using_indexes
註釋以下三行
#log-bin=mysql-bin
#binlog_format=mixed
#server-id = 1
從新啓動mysql
[root@slavedb02 ~]# mysqld_safe &
主服務器查看
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
從服務器設置
mysql> change master to master_host='192.168.0.10',master_user='replication',master_password='replication',master_log_file='mysql-bin.000003',master_log_pos=106;
Query OK, 0 rows affected (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)
查看從服務器狀態
mysql> show slave status\G;
Slave_IO_Running: No
Slave_SQL_Running: Yes
問題處理
查看原來主從兩邊的數據不一直致使的
主服務器上 /usr/local/mysql-5.1.44/data下多一個masterdb01.err文件
將其拷貝到從服務器修改屬主屬組
mysql> slave stop;
mysql> slave start;
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
ok問題解決
mysql> create database test1;
Query OK, 1 row affected (0.03 sec)
mysql> use test1;
Database changed
mysql> create table name (id int(4),name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into name values (1,'test');
Query OK, 1 row affected (0.00 sec)
mysql> select * from name;
+------+------+
| id | name |
+------+------+
| 1 | test |
+------+------+
1 row in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| test1 |
+--------------------+
4 rows in set (0.00 sec)
mysql> use test1;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| name |
+-----------------+
1 row in set (0.03 sec)
mysql> select * from name;
+------+------+
| id | name |
+------+------+
| 1 | test |
+------+------+
1 row in set (0.00 sec)
mysql>
Ok同步
從服務器配置
mysql> grant replication slave on *.* to 'replication'@'192.168.0.10' identified by 'replication';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
Master上測試: mysql -h 192.168.0.11 -u replication -preplication
從服務器上查看
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
主服務器配置
mysql> change master to master_host='192.168.0.11',master_user='replication',master_password='replication',master_log_file='mysql-bin.000005',master_log_pos=106;
Query OK, 0 rows affected (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)
查看從服務器狀態
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
在從庫上建立庫,看主是否能夠正常同步
一、查看binlog是否開啓
mysql> show variables like '%log%';
二、查看mysql的server_id
mysql> show variables like 'server_id';
三、查看全部二進制文件和大小
mysql> show binary logs;
刪除二進制文件
mysql> purge binary logs to 'mysql-bin.0000010';
刪除二進制文件mysql-bin.0000010,保留後面的。
四、查看mysql主的狀態
mysql> show master status;
五、查看mysql從的狀態
mysql> show slave status\G;
確認Slave_IO 和 Slave_SQL是否都爲yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
六、mysql啓動關閉
[root@slavedb02 ~]# mysqladmin shutdown -u root -predhat
[root@slavedb02 ~]# mysqld_safe &
七、Slave線程啓動和關閉
mysql> slave stop;
mysql> slave start;