1. 程式人生 > >LINUX——關於mysql中較詳細的,數據庫的主從配置,自動備份以及讀寫分離的使用

LINUX——關於mysql中較詳細的,數據庫的主從配置,自動備份以及讀寫分離的使用

rep lock ast name ocs lib .cn ket ger

1.主從簡介
數據在企業中是非常重要的一部分,存儲數據的數據庫多種多用樣,但卻都存在著一種隱患
·數據庫數據丟失
·數據庫訪問人數較多時,一臺數據庫無法保證服務質量
2.主從的作用
·實時災備,用於故障切換
·讀寫分離,提供查詢服務
·備份,避免影響業務
3.主從形式
·一主一叢
·主主復制
·一主多從
·多主一叢
·聯級復制
技術分享圖片
主從復制原理
技術分享圖片
主從復制步驟

主庫將所有寫的操作記錄到binlog日誌(二進制日誌)中並生成一個log dump線程,將binlog日誌傳給從庫的I/O線程
從庫生成兩個線程,一個I/O線程,一個SQL線程
·I/O線程去請求主庫的binlog,並將得到的binlog日誌寫到relay log(中繼日誌)文件中
·SQl線程,會讀取relay log 文件中的日誌,並解析成具體操作,來實現主從的操作一致,達到最終數據一致的目的

主從復制配置步驟:
1.確保從數據庫與主數據庫裏的數據一樣
2.在主數據庫創建一個同步賬號授權給從數據庫使用
3.配置主數據庫(修改配置文件)
4.配置從數據庫(修改配置文件)

配置需求:
環境介紹:搭建兩臺mysql服務器,一臺作為主服務器,一臺作為從服務器,主服務器進行寫操作,從服務器進行讀操作

配置信息
主數據庫 ip192.168.56.11 centos7 有數據
從數據庫 ip192.168.56.138 centos7 無數據

主從同步設置
防火墻設置

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# sed -ri ‘s/(SELINUX=).*/\1disabled/g‘ /etc/selinux/config
[root@localhost ~]# setenforce 0

下載二進制格式的mysql包

[root@localhost ~]# cd /usr/src/
[root@localhost src]# wget https://downloads.mysql.com/archives/get/file/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
[root@localhost src]# ls
debug  kernels  mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz

創建主和組

[root@localhost src]# groupadd -r mysql
[root@localhost src]# useradd -M -s /sbin/nologin -g mysql mysql
[root@localhost src]# tar xf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
[root@localhost src]# cd /usr/local/
[root@localhost local]# ln -sv mysql-5.7.22-linux-glibc2.12-x86_64/ mysql
"mysql" -> "mysql-5.7.22-linux-glibc2.12-x86_64/"

//修改目錄/usr/local/mysql的屬主屬組

[root@localhost local]# chown -R mysql.mysql /usr/local/mysql
[root@localhost local]# ll /usr/local/mysql -d
lrwxrwxrwx. 1 mysql mysql 36 9月   7 11:43 /usr/local/mysql -> mysql-5.7.22-linux-glibc2.12-x86_64/

//添加環境變量

[root@localhost local]# ls /usr/local/mysql
bin  COPYING  docs  include  lib  man  README  share  support-files
[root@localhost local]# echo ‘export PATH=/usr/local/mysql/bin:$PATH‘ > /etc/profile.d/mysql.sh
[root@localhost local]# . /etc/profile.d/mysql.sh
[root@localhost local]# echo $PATH
/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

//建立數據存放目錄

[root@localhost local]# mkdir /opt/data
[root@localhost local]# chown -R mysql.mysql /opt/data/
[root@localhost local]# ll /opt/
總用量 0
drwxr-xr-x. 2 mysql mysql 6 9月   7 11:47 data
drwxr-xr-x. 2 root  root  6 3月  26 2015 rh

//初始化數據庫

[root@localhost local]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/opt/data/
2018-09-07T03:48:13.790964Z 1 [Note] A temporary password is generated for root@localhost: n*Fsa&a+O1kN  /最後會生成一個臨時密碼

//從:數據庫初始化,前面步驟一樣,所以省略

[root@localhost local]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/opt/data/
2018-09-07T06:25:11.123940Z 1 [Note] A temporary password is generated for root@localhost: QR(XhNPpk6Qi

//生成配置文件/

[root@localhost ~]# cat > /etc/my.cnf <<EOF
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
EOF
//配置服務啟動腳本
[root@localhost ~]# cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@localhost ~]# sed -ri ‘s#^(basedir=).*#\1/usr/local/mysql#g‘ /etc/init.d/mysqld
[root@localhost ~]# sed -ri ‘s#^(datadir=).*#\1/opt/data#g‘ /etc/init.d/mysqld

//啟動mysql

[root@localhost ~]# /etc/init.d/mysqld start
[root@localhost ~]# ps -ef|grep mysql
[root@localhost ~]# ss -antl
LISTEN 0 80 :::3306 :::*

//修改密碼
//使用臨時密碼登陸

[root@localhost ~]# /usr/local/mysql/bin/mysql -uroot -p
Enter password:
mysql>
//設置新密碼
mysql> set password = password(‘guohui123‘);
以上是兩臺數據庫服務器的配置,配置方式相同

主://查看主從庫的備份

[root@localhost local]# mysql -uroot -pguohui123 -e ‘show databases;‘
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
創建一個庫,表
mysql> use guohui
Database changed
mysql> create table student (id int(11) NOT NULL,name varchar(100) NOT NULL,age TINYINT(3));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into student (id,name,age) value (1,‘tom‘,20);
Query OK, 1 row affected (0.05 sec)
mysql> desc student;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   |     | NULL    |       |
| name  | varchar(100) | NO   |     | NULL    |       |
| age   | tinyint(3)   | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> select * from student;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | tom  |   20 |
+----+------+------+
1 row in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| guohui             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

主://全備份主庫
全備主庫時需要另外開一個終端,給數據加上讀鎖,避免在備份期間有其他人在寫入數據導致數據不一致,並且鎖必須在備份完成後才能退出,退出則解鎖

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.01 sec)

主://備份主庫並將文件傳輸到從庫

[root@localhost ~]# mysqldump -uroot -pguohui123 --all-databases > /opt/all-20180907-1.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# ls /opt
all-20180907-1.sql  data  rh//傳輸
[root@localhost ~]# scp /opt/all-20180907-1.sql [email protected]:/opt/
The authenticity of host ‘192.168.56.138 (192.168.56.138)‘ can‘t be established.
ECDSA key fingerprint is SHA256:by
E1DjsPUpqjJssSP+RcbkM7+wcjdzMkjW3u09KrSB8.
ECDSA key fingerprint is MD5:c6:d2:a1:34:73:2f:66:c9:ac:db:ca:2b:7a:78:4f:75.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.56.138‘ (ECDSA) to the list of known hosts.
[email protected]‘s password:1    //這裏輸入root密碼
all-20180907-1.sql                                                  100%  783KB  19.2MB/s   00:00  
主://接觸鎖表狀態
mysql> quit
Bye

從://在從庫上恢復主庫的備份並查看有哪些庫,確保與主庫一致

//查看主備傳過來的文件
[root@localhost ~]# ls /opt
all-20180907-1.sql  data  rh
將文件導入從數據庫
[root@localhost ~]# mysql -uroot -pguohui123 < /opt/all-20180907-1.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
//查看數據庫
[root@localhost ~]# mysql -uroot -pguohui123 -e ‘show databases;‘
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| guohui             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

主://在主數據庫裏創建一個同步賬號授權給從數據庫使用

創建數據庫用戶guohui,密碼:guohui123,只能在192.168.56.138上遠程登陸
mysql> CREATE USER ‘guohui‘@‘192.168.56.138‘ IDENTIFIED BY ‘guohui123‘;
Query OK, 0 rows affected (0.00 sec)

賦予權限用戶guohui,可以在192.168.56.138上訪問本機所有數據庫的所有表,無需密碼:
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘guohui‘@‘192.168.56.138‘;
Query OK, 0 rows affected (0.00 sec)

重新加載特權:
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql>

主://配置主數據庫

[root@localhost ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
log-error = /opt/data/mysqld.log   //錯誤日誌
user = mysql
skip-name-resolve
#
log-bin = mysql_bin   //啟動binlog日誌
server-id = 2   //數據庫服務器唯一標識符,主庫的server-id值必須比從庫的大

啟動
[root@localhost ~]# /etc/init.d/mysqld restart
ERROR! MySQL server PID file could not be found!
Starting MySQL.Logging to ‘/opt/data/mysqld.log‘.
. SUCCESS!

查看主庫狀態:

mysql> show master status;
mysql_bin,文件裏寫的二進制文件名字
000001  版本
Position  位置 154
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

從://配置從數據庫

[root@localhost ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/
mysqldatadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
log-error = /opt/data/mysql.log
user = mysql
skip-name-resolve
#replication
server-id = 5  //設置從庫的唯一標識符,從庫的server-id值必須小於主庫的該值
relay-log = mysql_relay_log    //啟動中繼日誌relay-log啟動

[root@localhost ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL.Logging to ‘/opt/data/mysql.log‘.
SUCCESS!

從://配置並啟動主從復制

CHANGE MASTER TO                       指定的主服務器
MASTER_HOST=‘192.168.56.11‘,     指定的主服務器ip
MASTER_USER=‘guohui‘,
MASTER_PASSWORD=‘guohui123‘,  密碼
MASTER_LOG_FILE=‘mysql-bin.000001‘,     二進制文件的名字與版本
MASTER_LOG_POS=154;                   位置 154

mysql> change master to master_host=‘192.168.56.11‘,master_user=‘guohui‘,master_password=‘guohui123‘,master_log_file=‘mysql_bin.000001‘,master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

啟動從服務的從服務
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

從://查看從服務器狀態

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.56.11
                  Master_User: guohui
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql_bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql_relay_log.000004
                Relay_Log_Pos: 367
        Relay_Master_Log_File: mysql_bin.000002
             Slave_IO_Running: Yes       //必須yes
            Slave_SQL_Running: Yes     //必須yes
mysql>

測試:
主://在數據庫中插入數據

mysql> select * from student;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | tom  |   20 |
+----+------+------+
1 row in set (0.00 sec)

mysql> insert into student value (1,‘jerry‘,23);
Query OK, 1 row affected (0.00 sec)

mysql> select * from student;
+----+-------+------+
| id | name  | age  |
+----+-------+------+
|  1 | tom   |   20 |
|  1 | jerry |   23 |
+----+-------+------+
2 rows in set (0.00 sec)

mysql>

從://查看測試結果

mysql> use guohui;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from student;
+----+-------+------+
| id | name  | age  |
+----+-------+------+
|  1 | tom   |   20 |
|  1 | jerry |   23 |
+----+-------+------+
2 rows in set (0.00 sec)

mysql>

由此可見,數據庫的主從功能,搭建成功

LINUX——關於mysql中較詳細的,數據庫的主從配置,自動備份以及讀寫分離的使用