1. 程式人生 > 實用技巧 >MySQL結構介紹及多例項主從複製

MySQL結構介紹及多例項主從複製

目錄

一.mysql結構介紹

1.客戶端與服務端模型

1.資料是一個典型的C/S結構的服務

mysql自帶的客戶端工具
	mysql
	mysqladmin
	mysqldump
	
mysql是一個二進位制程式,後臺守護程序
	單程序
	多執行緒

2.mysql的連線方式

#1.TCP/IP連線
#2.socket連線

	#tcp/ip連線
	mysql -uroot -p -h127.0.0.1
	mysql -uroot -p -h127.0.0.1 -S /tmp/mysql.sock
	
	#socket連線
	mysql -uroot -p -hlocalhost
	mysql -uroot -p
	
	#注意:
	1)不一定-h就是TCP/IP連線,如果是localhosts就是socket連線
	2)socket連線比TCP/IP連線快,TCP/IP連線需要經過三次握手,四次揮手,慢
	3)socket連線只能本地連線,遠端不能使用

2.例項

#1.什麼是單例項?
	一個程序 + 多個執行緒 + 一個預分配的記憶體空間
#2.什麼是多例項?
	多個程序 + 多個執行緒 + 多個預分配的記憶體空間

3.mysql程式結構

1)連線層

1.驗證使用者身份,判斷使用者名稱和密碼
2.提供兩種連線方式
3.與SQL層建立互動的執行緒

2)sql層

1.接收連線層傳過來的資料
2.判斷sql語句的語法
3.判斷SQL語句的語義
4.解析器:解析sql語句,生成執行計劃
5.優化器:選出執行計劃中最優的計劃
6.執行器:執行計劃
	6.1 與儲存引擎層建立互動
	6.2 將優化後要執行的SQL發給儲存引擎層
7.記錄快取,如果前端有redis,將資料快取至redis
8.記錄日誌

3)儲存引擎層

1.與sql層建立互動,接收SQL層傳來的SQL語句
2.與磁碟進行互動,獲取資料,將資料返回給sql層

4.mysql邏輯結構

1.庫:庫的下面全是表
2.表:元資料 + 真實資料行
3.元資料:列 + 其它屬性(行數+佔用空間大小+許可權)
4.列:列名字 + 資料型別 + 其他約束(非空、唯一、主鍵、非負數、自增長、預設值)

5.mysql物理結構

1.MySQL的最底層的物理結構是資料檔案,也就是說,儲存引擎層,打交道的檔案,是資料檔案。
2.儲存引擎分為很多種類(Linux中的FS)
3.不同儲存引擎的區別:儲存方式、安全性、效能

#資料庫建立時,不論庫名還是表名,儘量都用小寫字母

6.mysql物理大小

1.段:理論上一個表就是一個段,由多個區構成,(分割槽表是一個分割槽一個段)
2.區:連續的多個頁構成
3.頁:最小的資料儲存單元,預設是16k

4.分割槽表:一個區構成一張段,就是一張表

二.mysql多例項

#mysql 多例項,也是多個配置檔案啟動資料庫

mysql多個配置檔案:
1.多個埠
2.多個socket檔案
3.多個日誌檔案
4.多個srver_id
5.多個數據目錄

1.建立多例項目錄

[root@db03 local]# mkdir /usr/local/{3307,3308,3309}

2.編輯配置檔案

[root@db03 local]# vim /usr/local/3307/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/3307/data
port=3307
socket=/usr/local/3307/mysql.sock
server_id=1
log_err=/usr/local/3307/data/mysql.err
log_bin=/usr/local/3307/data/mysql-bin
skip-name-resolve

[root@db03 local]# vim /usr/local/3308/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/3308/data
port=3308
socket=/usr/local/3308/mysql.sock
server_id=2
log_err=/usr/local/3308/data/mysql.err
log_bin=/usr/local/3308/data/mysql-bin
skip-name-resolve

[root@db03 local]# vim /usr/local/3309/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/3309/data
port=3309
socket=/usr/local/3309/mysql.sock
server_id=3
log_err=/usr/local/3309/data/mysql.err
log_bin=/usr/local/3309/data/mysql-bin
skip-name-resolve

3.初始化多例項資料目錄

[root@db03 local]# cd /usr/local/mysql/scripts/

#3307
[root@db03 scripts]# ./mysql_install_db --defaults-file=/usr/local/3307/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/3307/data

#3308
[root@db03 scripts]# ./mysql_install_db --defaults-file=/usr/local/3308/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/3308/data

#3309
[root@db03 scripts]# ./mysql_install_db --defaults-file=/usr/local/3309/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/3309/data

4.授權目錄

[root@db03 scripts]# cd /usr/local/

[root@db03 local]# chown -R mysql.mysql /usr/local/330*

5.啟動多例項

#關閉mysql(3306)
[root@db03 scripts]# systemctl stop mysqld
[root@db03 local]# cd /usr/local/mysql/scripts/

#開啟
[root@db03 scripts]# mysqld_safe --defaults-file=/usr/local/3307/my.cnf &
[root@db03 scripts]# mysqld_safe --defaults-file=/usr/local/3308/my.cnf &
[root@db03 scripts]# mysqld_safe --defaults-file=/usr/local/3309/my.cnf &

#檢視是否啟動(有的機器能啟三個,有的可能有四個,所以關閉3306的mysql)
[root@db03 scripts]# netstat -lntp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6680/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      6763/master         
tcp6       0      0 :::3307                 :::*                    LISTEN      8628/mysqld         
tcp6       0      0 :::3308                 :::*                    LISTEN      8920/mysqld         
tcp6       0      0 :::3309                 :::*                    LISTEN      9283/mysqld         
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::22                   :::*                    LISTEN      6680/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      6763/master         

6.連線多例項並驗證

[root@db03 scripts]# mysql -S /usr/local/3307/mysql.sock -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
[root@db03 scripts]# mysql -S /usr/local/3308/mysql.sock -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
[root@db03 scripts]# mysql -S /usr/local/3309/mysql.sock -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 3     |
+---------------+-------+

7.mysql多例項設定密碼

[root@db03 scripts]# mysqladmin -S /usr/local/3307/mysql.sock -uroot password '123'
Warning: Using a password on the command line interface can be insecure.
[root@db03 scripts]# mysqladmin -S /usr/local/3308/mysql.sock -uroot password '123'
Warning: Using a password on the command line interface can be insecure.
[root@db03 scripts]# mysqladmin -S /usr/local/3309/mysql.sock -uroot password '123'
Warning: Using a password on the command line interface can be insecure.

8.設定密碼後連線

[root@db03 scripts]# mysql -S /usr/local/3307/mysql.sock -uroot -p
Enter password:
#可以登陸

#1.弄一個簡單的連線方式
[root@db03 scripts]# vim /usr/bin/mysql3307
mysql -S /usr/local/3307/mysql.sock -uroot -p

[root@db03 scripts]# vim /usr/bin/mysql3308
mysql -S /usr/local/3308/mysql.sock -uroot -p

[root@db03 scripts]# vim /usr/bin/mysql3309
mysql -S /usr/local/3309/mysql.sock -uroot -p

#2.授權
[root@db03 scripts]# chmod +x /usr/bin/mysql33*

#3.試試能不能用
[root@db03 scripts]# mysql3307
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.6.46-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
#

三.資料庫多例項實現主從複製

1.主庫操作

1.開啟binlog(前面已經寫好)

[root@db03 scripts]# vim /usr/local/3307/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/3307/data
port=3307
socket=/usr/local/3307/mysql.sock
server_id=1
log_err=/usr/local/3307/data/mysql.err
log_bin=/usr/local/3307/data/mysql-bin
skip-name-resolve

2.主庫授權一個使用者,給從庫用來連線

mysql> grant replication slave on *.* to rep@'172.16.1.%' identified by '123';
Query OK, 0 rows affected (0.18 sec)

3.主庫檢視binlog資訊

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      468 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.03 sec)

2.從庫的操作

#從庫需要知道的主庫資訊
主庫的IP
連線主庫用的使用者和密碼
binlog資訊

1.登陸資料庫,配置主從

#3308和3309都要執行操作
mysql> change master to
    -> master_host='172.16.1.53',
    -> master_user='rep',
    -> master_password='123',
    -> master_log_file='mysql-bin.000003',
    -> master_log_pos=468,
    -> master_port=3307;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

2.開啟主從複製

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

3.檢視主從是否成功

#3308,3309都執行,IO,SQL都是yes就說明成功
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.53
                  Master_User: rep
                  Master_Port: 3307
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 468
               Relay_Log_File: db03-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000003
             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: 468
              Relay_Log_Space: 455
              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
                  Master_UUID: a5c9a5c5-c2b0-11ea-9dbb-000c29354aad
             Master_Info_File: /usr/local/3308/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)

4.IO執行緒不為YES

1.測試網路
[root@db03 ~]# ping 172.16.1.53

2.測試埠
[root@db03 ~]# telnet 172.16.1.53 3307

3.測試主庫授權的使用者登入
[root@db03 ~]# mysql -urep -p123 -h172.16.1.53 -P3307

4.跳過反向解析設定
[root@db03 service]# vim /service/3307/my.cnf 
skip-name-resolve

5.UUID相同
[root@db03 ~]# cat /service/3307/data/auto.cnf 
[auto]
server-uuid=527f6221-c286-11ea-9ca7-000c29e19d84

5.SQL執行緒不為YES

1.主庫有資料,從庫沒有
2.從庫有資料,主庫沒有
#主從資料庫資料不一致

#解決方法:把主庫的資料全部匯出來,放到從庫裡去,保證主從庫資料一致,再做一次主從複製