MySQL結構介紹及多例項主從複製
阿新 • • 發佈:2020-07-11
目錄
一.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.從庫有資料,主庫沒有
#主從資料庫資料不一致
#解決方法:把主庫的資料全部匯出來,放到從庫裡去,保證主從庫資料一致,再做一次主從複製