Mysql的主從服務器mysql
對於公司數據庫的須要,咱們有時須要創建主從服務器,在這裏我給你們演示兩個創建過程,一個是對於一個全新的主從服務器的創建(即數據庫裏尚未存在任何數據信息),另外一個是在有數據信息的基礎上創建從服務器。sql
在演示以前,先簡單介紹一個主從服務器的相關知識:數據庫
從服務器是如何實現經過主服務器實現數據複製的:主服務器經過dump線程將主服務器上的二進制日誌傳遞給了從服務器,從服務器將此二進制日誌變成本身的中繼日誌,在經過I/O線程將中繼日誌傳遞給本機上的SQL線程,本機經過SQL線程寫入數據,來實現數據的複製。 vim
注意事項:服務器
每一個服務器都有惟一的service IDide
在主服務器上須要創建從服務器複製數據用的帳號spa
如果在互聯網上傳輸須要利用ssl線程
做爲從服務器,其數據庫的版本不能比主服務器低,以避免一些SQL命令用到的功能不能在從服務器上執行 日誌
案例一:全新的沒有任何數據orm
前提:兩臺主機上都安裝好了mysql,其可以正常啓動,
在主服務器上執行如下操做
[root@mail ~]# vim /etc/my.cnf
innodb_file_per_table=1 可添加以下一行使mysql的每一個表有本身獨立的空間
[root@mail ~]# service mysqld start 啓動mysql
Starting MySQL..... [ OK ]
mysql> grant replication client,replication slave on *.* to repl@'172.16.%.%' identified by 'redhat'; 在主服務器上添加從服務器可使用的本地用戶,使他對於全部數據庫的全部表有權限,其用戶名是repl,主機地址是172.16網段的全部地址,密碼是redhat
mysql> flush master; 清空主服務器日誌
在從服務器上執行如下操做
[root@localhost ~]# vim /etc/my.cnf 修改mysql的配置文件信息
server-id = 11 不能和主服務器的service ID同樣
#log-bin=mysql-bin 關閉二進制日誌,是否關閉能夠根據本身的需求決定
relay-log=relay-bin 開啓了中繼日誌的功能
relay-log-index=relay-bin.index
innodb_file_per_table=1
[root@localhost ~]# service mysqld start 啓動mysql
mysql> flush slave; 清空從服務器日誌
mysql>change master to master_host='172.16.19.9',master_user='repl',master_password
='redhat'; 指定其主服務器是172.16.19.9上的數據庫,複製數據時使用的帳號和密碼
mysql> start slave; 開啓從服務器
mysql> show slave status\G; 若這兩個運行狀態都爲yes,則主從服務器創建成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
能夠驗證一下是否真正成功
mysql> create database feng; 在主服務器上建立數據庫
Query OK, 1 row affected (0.00 sec)
mysql> show databases; 在從服務器上查看
+--------------------+
| Database |
+--------------------+
| information_schema |
| feng |
| mysql |
| performance_schema |
| test |
+--------------------+
顯示出這個表中包含在主服務器上建立的數據庫feng,則恭喜你全新的主從服務器建立成功。
案例二:給已經有數據的數據庫創建從服務器
在主服務器上執行如下操做
mysql> grant replication client,replication slave on *.* to repl@'172.16.%.%' identified by 'redhat'; 在主服務器上添加用戶
mysql> flush logs;
[root@mail ~]# mysqldump --all-databases --lock-all-tables --master-data=2 >/tmp/all-slave.sql 因爲個人也是在虛擬機上新建的mysql, root用戶尚未密碼,全部執行了這樣的命令,
若你的mysql已經有密碼,執行的命令則以下
# mysqldump -uroot -p'redhat' --all-databases --lock-all-tables --master-data=2 >/tmp/all-slave.sql 將數據保存到/tmp/all-slave.sql
mysqldump是數據庫備份命令,-u後跟用戶,-p後跟密碼
--all-databases 指定全部的數據庫
--lock-all-tables 並對全部的表上鎖
--master-data=2 在備份的時候導出二進制文件的位置
在從服務器上執行如下操做
將在主服務器上備份的文件all-slave.sql,移動到從服務器的/tmp目錄下
[root@localhost ~]# vim /etc/my.cnf 修改如下信息
server-id = 11
#log-bin=mysql-bin
relay-log=relay-bin
relay-log-index=relay-bin.index
innodb_file_per_table=1
[root@localhost ~]# service mysqld start 啓動mysql
Starting MySQL.. [ OK ]
[root@localhost ~]# head -30 /tmp/
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=183;
查看文件all-slave.sql,記住以下行從哪一個二進制日誌開始到哪一個點
mysql> source /tmp/all-slave.sql; 載入一些備份的數據庫
mysql>change master to master_host='172.16.19.9',master_user='repl',master_password
='redhat',master_log_file='mysql-bin.000003',master_log_pos=183;
此處在指定主服務器的時候還要指出從哪一個日誌的哪一個點開始
mysql> start slave;
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| extmail |
| feng |
| haha |
| jiaowu |
| jun |
| mydb |
| mysql |
| performance_schema |
| test |
+--------------------+
10 rows in set (0.00 sec)
經過數據庫能夠看出備份的數據再入成功
能夠驗證是否主從服務器真正創建成功
在主服務上執行下面的命令
mysql> show slave hosts; 顯示有哪些從服務器
+-----------+------+------+-----------+
| Server_id | Host | Port | Master_id |
+-----------+------+------+-----------+
| 11 | | 3306 | 1 |
+-----------+------+------+-----------+
若是你能看到這個表格,一樣恭喜你,主從服務器你也已經穿件成功了。
對於這樣建立主從服務器,其實還存在一些隱患的,從服務器能夠寫入數據的,嚴格來講從服務器是不容許寫入數據的,因此主從服務器可使用如下配置:
主服務器:
sync_binlog=1 任何事務提交以後都要寫入二進制文件
innodb_flush_logs_at_trx_commit=1 在事務提交的時候將日誌當即寫入磁盤
這兩項來解決服務器忽然崩潰形成事務提交但沒有寫入二進制日誌的問題
從服務器:
skip_slave_start=1 定義mysql啓動時不自動進入從服務器線程
read_only=1 定義從服務沒有本身寫數據的權限
relay-log=relay-bin 開啓了中繼日誌的功能
relay-log-index=relay-bin.index
replicate_do_db=db_name 定義從服務器對哪些數據庫進行復制
rpplicate_ignore_db=db_name 定義從服務器不給哪些數據庫經行復制
replicate_do_table=tb_name 對錶的限制
replicate_ignore_table=tb_name
replicate_wild_do_table=mageedu.tb% 對那些表的限制
replicate_wild_ignore_table
若能夠對多個數據庫複製則要使用一些格式
replicate_do_db=db_name1
replicate_do_db=db_name2