Mysql(Mariadb)數據庫主從複製

Mysql主從複製的實現原理圖大體以下:mysql

 

MySQL之間數據複製的基礎是二進制日誌文件(binary log file)來實現的,一臺MySQL數據庫一旦啓用二進制日誌後,其做爲master,它數據庫中全部操做都會以「事件」的方式記錄在二進制日誌中,其餘數據庫做爲slave經過一個I/O線程與主服務器保持通訊,並監控master的二進制日誌文件的變化,若是發現master二進制日誌文件發生變化,則會把變化複製到本身的中繼日誌中,而後slave的一個SQL線程會把相關的「事件」執行到本身的數據庫中,以此實現從數據庫和主數據庫的一致性,也就實現了主從複製。MySQL(MariaDB)具體詳細的安裝能夠參考Linux就該這麼學》教程的第十八章節,裏面內容寫的很是詳細,適合初學者,本文也比較適合企業應用。linux

 

實現MySQL主從複製配置要求sql

主服務器:一、開啓數據庫二進制日誌功能;二、配置數據庫認證惟一服務id;三、得到主庫的二進制日誌文件名及位置四、在主庫上面建立一個用於主庫和從庫通訊的用戶帳號,安全管理。數據庫

從服務器:一、在從庫中配置惟一服務id;二、使用主庫建立分配的用戶帳號讀取主庫的二進制日誌;三、啓用slave功能,用於主從通訊。vim

 

1、準備工做:安全

1.主從數據庫版本最好一致服務器

2.主從數據庫內數據保持一致性能

主數據庫(master):192.168.3.91    /CentOS Linux release 7.5.1804 (Core)測試

從數據庫( slave ) :192.168.3.218   /CentOS Linux release 7.5.1804 (Core)spa

 

注意:這裏的主從都是經過yum源安裝的mariadb 5.5.56;

# yum install mariadb-server.x86_64 mariadb.x86_64  -y

 

//設置mariadb服務

# systemctl start mariadb.service &&  systemctl enable mariadb.service

 

//設置mariadb數據庫root帳號的密碼,默認root用戶是沒有密碼;

# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB

      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

 

In order to log into MariaDB to secure it, we'll need the current

password for the root user.  If you've just installed MariaDB, and

you haven't set the root password yet, the password will be blank,

so you should just press enter here.

Enter current password for root (enter for none):

OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB

root user without the proper authorisation.

Set root password? [Y/n] y

New password:

Re-enter new password:

Password updated successfully!

Reloading privilege tables..

 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone

to log into MariaDB without having to have a user account created for

them.  This is intended only for testing, and to make the installation

go a bit smoother.  You should remove them before moving into a

production environment.

Remove anonymous users? [Y/n] y

 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This

ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] n

 ... skipping.

By default, MariaDB comes with a database named 'test' that anyone can

access.  This is also intended only for testing, and should be removed

before moving into a production environment.

Remove test database and access to it? [Y/n] n

 ... skipping.

Reloading the privilege tables will ensure that all changes made so far

will take effect immediately.

 

Reload privilege tables now? [Y/n] y

 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB

installation should now be secure.

Thanks for using MariaDB!

 

2、主數據庫master修改:

1.修改mysql配置

找到主數據庫的配置文件my.cnf(或者my.ini),個人在/etc/my.cnf,在[mysqld]部分插入以下兩行:

# find / -name my.cnf

默認配置

[mysqld]log-bin=mysql-bin #開啓二進制日誌 server-id=1 #設置server-id

 log-bin="/var/lib/mysql/" #設定生成的log文件名; 

修改後:

# systemctl restart mariadb.service

 

2.重啓mysql,建立用於同步的用戶帳號

# mysql -hlocalhost -uroot -ppassword

建立用戶並受權:用戶:wxp,密碼:password

MariaDB [(none)]> CREATE USER 'wxp'@'192.168.3.218' IDENTIFIED BY 'password';#建立用戶

MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'wxp'@'192.168.3.218';#分配權限

 MariaDB [(none)]>flush privileges;    #刷新權限

 

3.查看master狀態,記錄二進制文件名(mysql-bin.000001)和位置(492):

MariaDB [(none)]> SHOW MASTER STATUS;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001 |      492 |              |                  |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

 

2、從服務器slave修改:

1.修改mysql配置

一樣找到my.cnf配置文件,添加server-id

# find / -name my.cnf

my.cnf默認配置

[mysqld]server-id=2  #設置server-id,必須惟一

 log-bin="/var/lib/mysql/" #設定生成的log文件名; 

修改後:

# systemctl restart mariadb.service

 

2.重啓mysql,打開mysql會話,執行同步SQL語句(須要主服務器主機名,登錄憑據,二進制文件的名稱和位置):

# mysql -hlocalhost -uroot -ppassword

MariaDB [(none)]> CHANGE MASTER TO      -> MASTER_HOST='192.168.3.91',     -> MASTER_USER='wxp',     -> MASTER_PASSWORD='password',     -> MASTER_LOG_FILE='mysql-bin.000001',     -> MASTER_LOG_POS=492;

這裏是直接把信息寫入到數據庫裏面,

 

mysql> select * from mysql.slave_master_info \G

 

3.啓動slave同步進程:

MariaDB [(none)]>start slave;

 

4.查看slave狀態:

MariaDB [(none)]> show slave status\G;

MariaDB [(none)]> show slave status\G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.3.91

                  Master_User: wxp

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000001

          Read_Master_Log_Pos: 492

               Relay_Log_File: mariadb-relay-bin.000002

                Relay_Log_Pos: 529

        Relay_Master_Log_File: mysql-bin.000001

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 0

                   Last_Error:

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 492

              Relay_Log_Space: 825

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File:

           Master_SSL_CA_Path:

              Master_SSL_Cert:

            Master_SSL_Cipher:

               Master_SSL_Key:

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 0

               Last_SQL_Error:

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 1

1 row in set (0.00 sec)

ERROR: No query specified

 

Slave_IO_RunningSlave_SQL_Running都爲YES的時候就表示主從同步設置成功了。接下來就能夠進行一些驗證了,好比在主master數據庫的test數據庫的一張表中插入一條數據,在slave的test庫的相同數據表中查看是否有新增的數據便可驗證主從複製功能是否有效,還能夠關閉slave(MariaDB [(none)]>stop slave;),而後再修改master,看slave是否也相應修改(中止slave後,master的修改不會同步到slave),就能夠完成主從複製功能的驗證了。

 

五、測試,操做Master數據庫

MariaDB [(none)]> use test;

Database changed

MariaDB [test]> create table t1(Name varchar(18));

Query OK, 0 rows affected (0.03 sec)

 

MariaDB [test]> insert into t1(Name) values('wxp');

Query OK, 1 row affected (0.01 sec)

 

MariaDB [test]> select * from t1;

+------+

| Name |

+------+

| wxp  |

+------+

1 row in set (0.00 sec)

 

slave上面查看test庫是否有數據同步過來;

[root@backup-3-218 ~]# mysql -hlocalhost -uroot -ppassword

MariaDB [(none)]> use test;

MariaDB [test]> show tables;

+----------------+

| Tables_in_test |

+----------------+

| t1             |

+----------------+

1 row in set (0.00 sec)

 

MariaDB [test]> select * from t1;

+------+

| Name |

+------+

| wxp  |

+------+

1 row in set (0.00 sec)

 

六、還能夠用到的其餘相關參數:

master開啓二進制日誌後默認記錄全部庫全部表的操做,能夠經過配置來指定只記錄指定的數據庫甚至指定的表的操做,具體在mysql配置文件的[mysqld]可添加修改以下選項:

# 不一樣步哪些數據庫  

# vim /etc/my.cnf binlog-ignore-db = mysql   binlog-ignore-db = test   binlog-ignore-db = information_schema   

 

# systemctl restart mariadb.service

   # 只同步哪些數據庫,除此以外,其餘不一樣步  binlog-do-db = wxp

 

# 日誌保留時間

expire_logs_days = 10

 

# 控制binlog的寫入頻率。每執行多少次事務寫入一次

# 這個參數性能消耗很大,但可減少MySQL崩潰形成的損失

sync_binlog = 5

 

# 日誌格式,建議mixed

# statement 保存SQL語句

# row 保存影響記錄數據

# mixed 前面兩種的結合

binlog_format = mixed

 

在slave數據庫上面操做,設置從新鏈接超時時間

# 中止主從同步

mysql> stop slave;

 

# 鏈接斷開時,從新鏈接超時時間

mysql> change master to master_connect_retry=50;

 

# 開啓主從同步

mysql> start slave;

相關文章
相關標籤/搜索