MySQL Replication 即主從復制
流程示意圖:
A-->change data-->bin_log-->transfer-->B-->repl_log-->change data
一、搭建好了一個mysql,跑的是3306端口。
1、下載mysql到/usr/local/src/
wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
2、解壓縮
tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
3.把解壓完的數據移動到/usr/local/mysql
mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
4.建立mysql用戶
useradd?-s?/sbin/nologin?mysql
5.初始化數據庫
cd /usr/local/mysql mkdir -p /data/mysql chown -R mysql:mysql ?/data/mysql ./scripts/mysql_install_db ?--user=mysql ?--datadir=/data/mysql
6.拷貝配置文件cp support-files/my-large.cnf ? /etc/my.cnf
拷貝配置文件
7.拷貝啟動腳本文件並修改其屬性
cp support-files/mysql.server ? ?/etc/init.d/mysqld
chmod 755 ?/etc/init.d/mysqld
8.修改啟動腳本
vim /etc/init.d/mysqld
需要修改的地方有 “datadir=/data/mysql”
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?basedir=/usr/local/mysql
9.把啟動腳本加入系統服務項,並設定開機啟動,啟動mysql
chkconfig --add mysqld chkconfig mysqld on 或service mysqld start或/etc/init.d/mysqld start
檢查mysqld是否啟動的命令為:ps aux |grep mysqld
二、下面再搭建一個3307端口的mysql:
[root@localhost?~]#? mkdir /data/mysql_slave
[root@localhost?~]# chown -R mt=ysql:mysql /data/mysql_slave
[root@localhost?~]#?cd?/usr/local/
[root@localhost?local]#?cp?-r?mysql?mysql_slave
[root@localhost?local]#?cd?mysql2
[root@localhost mysql_slave]#./scripts/mysql_install_db --user=mysql? --datadir=/data/mysql_slave
[root@localhostmysql_slave]#?cp?/etc/my.cnf? .
[root@localhost?mysql_slave]#?vim?my.cnf
【mysqld】
?改為:port = 3307 ?
?改為:socket = /tmp/mysql_slave.sock
在這一行的下面再加一行:
?datadir=?/data/mysql_slave?
保存後就可以啟動它了:
[root@localhost mysql_slave]#?cd bin/
[root@localhost bin]# ./mysqld_safe --defaults-file=../my.cnf --user=mysql &
重啟:pid=`ps aux|grep mysql2.sock|grep -v grep|awk ‘{print $2}‘`;kill $pid;cd /usr/local/mysql2/bin/; ./mysqld_safe --default-file=../my.cnf --user=mysql &
若開機啟動,需要把啟動命令加入到/etc/rc.local中
如果想跟mysqld一樣腳本啟動,則:
[root@localhost mysql_slave]#?cd /etc/init.d/
[root@localhost init.d]# cp mysqld ?mysqldslave
vim mysqldslave
改datadir=/data/mysql” ? ?為 ? datadir=/data/mysql_slave
?? basedir=/usr/local/mysql 為 ? basedir=/usr/local/mysql_slave
改conf=/etc/my.cnf ? ? ? ? ? ?為 ? conf=$basedir/my.cnf
也可以配置到/etc/init.d/mysqlslave
cp -r mysql mysql_slave
同樣修改
basedir=/usr/local/mysql_slave
datadir=/data/mysql_slave
conf=$basedir/my.cnf
後面的conf路徑
conf=$basedir/my.cnf
但是不能使用/etc/init.d/mysqlslave start啟動
可以使用service mysqlslave start
[root@hardman bin]# chkconfig --add mysqldslave
[root@hardman bin]# chkconfig mysqldslave on
[root@hardman bin]# chkconfig --add mysqld
[root@hardman bin]# chkconfig mysqld on
也可以將寫入到/etc/rc.d/rc.local文件中:
echo?"./mysqld_safe?--defaults-file=../my.cnf?--user=mysql?&"?>>/etc/rc.d/rc.local
三、在主服務器上創建測試數據庫:
三、在主服務器上創建測試數據庫:
登錄兩臺mysql
mysql -h127.0.0.1 -P3306 #通過主機端口登陸
mysql -h127.0.0.1 -P3307
mysql -S /tmp/mysql.sock #通過sock登陸
mysql -S /tmp/mysql_slave.sock
mysql -uroot -p密碼 #通過密碼登陸
登錄mysql:/usr/local/mysql/bin/mysql -uroot -p199610
? ? ? ? 或mysql -S ?/tmp/mysql.sock ?
登錄mysql_slave:mysql -S ?/tmp/mysql_slave.sock ?或者mysql -h127.0.0.1 -P3307 (無密)
?
把3306端口的mysql作為主(master),而把3307的mysql作為從(slave)
為了讓實驗更加像生產環境,先在master上創建一個庫db1
[root@localhost?bin]#?mysql?-uroot?-S?/tmp/mysql.sock -p199610
mysql>?create?database?db1;
Query?OK,?1?row?affected?(0.01?sec)
mysql>?quit
Bye
// -S 後面指定mysql的socket文件路徑,這也是登陸mysql的一種方法,因為在一臺服務器上跑了兩個mysql端口,所以,只能用 -S 這樣的方法來區分。
?
創建了db1庫,然後把mysql庫的數據復制給它:
mysqldump?-uroot?-S?/tmp/mysql.sock? mysql?>?123.sql ? ? #備份?
mysql?-uroot?-S?/tmp/mysql.sock?db1?<?123.sql ? ? #恢復
-
設置主master
修改配置文件:vim?/etc/my.cnf
在[mysqld]部分查看是否有以下內容,如果沒有則添加:
server-id=1
log-bin=mysql-bin //可以修改為aiker等等
除了這兩行是必須的外,還有兩個參數,你可以選擇性的使用其中一個:
#指定庫的主從#binlog-do-db=db1,db2
#忽略指定庫主從,黑名單
#binlog-ignore-db=mysql
binlog-do-db=
#需要復制的數據庫名,多個數據庫名,使用逗號分隔。
binlog-ignore-db= #不需要復制的數據庫庫名,多個數據庫名,使用逗號分隔。這兩個參數其實用一個就可以
重啟mysql服務:/etc/init.d/mysqld restart
ls ?/data/mysql
查看/data/mysql下,會出現以log-bin值文件:
aiker.000001??
?
設置mysql數據庫的root訪問密碼:
設置密碼:mysqladmin?-uroot?-S?/tmp/mysql.sock?password?‘199610‘
登錄:mysql?-uroot?-S?/tmp/mysql.sock?-p‘199610‘
?mysql>?grant?replication?slave?on?*.*?to?‘repl‘@‘127.0.0.1‘?identified?by?‘123456‘;
//這裏的repl是為slave端設置的訪問master端mysql數據的用戶,密碼為123456,這裏的127.0.0.1為slave的ip(因為我們配置的master和slave都在本機)。
mysql>?flush privileges; ? ? ? #刷新?? mysql>flush tables with read lock; #鎖定數據庫,此時不允許更改任何數據 mysql>unlock tables; mysql> show master status; #查看狀態,這些數據是要記錄的,一會要在slave端用到 +--------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------+----------+--------------+------------------+ | aiker.000001 | 587 | | | +--------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
- 設置slave
先修改slave的配置文件my.cnf:vim?/usr/local/mysql_slave/my.cnf
找到 “server-id = 1” 這一行,刪除掉或者改為 “server-id = 2” 總之不能讓這個id和master一樣,否則會報錯。
另外在從上,如下兩行,黑白名單,看主mysql有沒有配置replicate-do-db=db1,db2 replicate-ignore-db=db1,db2
改完後,重啟slave:
service mysqld_slave restart
拷貝master上的db1庫的數據到slave上,因為master和slave都在一臺服務器上,所以操作起來簡單了很多,如果是不同的機器,可能就需要遠程拷貝了,希望你註意這一點:
[root@localhost?~]#?mysqldump?-uroot?-S?/tmp/mysql.sock?-pyourpassword db1?>?123.sql
[root@localhost?~]#?mysql?-uroot?-S?/tmp/mysql_slave.sock?-pyourpassword?-e?"create?database?db1"
[root@localhost?~]#?mysql?-uroot?-S?/tmp/mysql_slave.sock?-pyourpassword?db1?<?db1.sql
二行中,-e選項,它用來把mysql的命令寫到shell中,這樣可以方便把mysql操作寫進腳本中,它的格式就是?-e?"commond"?它很實用。
把數據拷貝過來後,就需要在slave上配置主從了:
mysql> slave stop;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> change master to master_host=‘127.0.0.1‘,master_port=3306,master_user=‘repl‘, master_password=‘123123‘,master_log_file=‘aiker.000001‘, master_log_pos=587;
Query OK, 0 rows affected (0.02 sec)
mysql> slave start;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
在主mysql上解鎖
mysql -uroot -S /tmp/mysql_slave.sock -p123123 -e "unlock tables"
或者
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
3、測試主從
在master上執行如下命令:
[root@hardman bin]# mysql -uroot -S /tmp/mysql.sock -pederew -e "use db1;select count(*) from db"
+----------+
| count(*) |
+----------+
| 2 |
+----------+
[root@hardman bin]# mysql -uroot -S /tmp/mysql.sock -pederew -e "use db1;truncate table db" 清空db1的表
[root@hardman bin]# mysql -uroot -S /tmp/mysql.sock -pederew -e "use db1;select count(*) from db"
+----------+
| count(*) |
+----------+
| 0 |
+----------+
[root@hardman ~]# mysql -S /tmp/mysql_slave.sock -e "use db1;select count(*) from db"
+----------+
| count(*) |
+----------+
| 0 |
+----------+
slave上的該表也被清空了。這樣好像不太明顯,不妨繼續把db表刪除試試:
[root@hardman ~]# mysql -S /tmp/mysql_slave.sock -e "use db1;select count(*) from db"
ERROR 1146 (42S02) at line 1: Table ‘db1.db‘ doesn‘t exist
主從配置起來很簡單,但是這種機制也是非常脆弱的,一旦我們不小心在從上寫了數據,那麽主從也就被破壞了。另外如果重啟master,務必要先把slave停掉,也就是說需要在slave上去執行 slave stop 命令,然後再去重啟master的mysql服務,否則很有可能就會中斷了。當然重啟完後,還需要把slave給開啟 slavestart.
MySQL Replication 即主從復制