mysql常見問題-學習筆記
MySQL常見問題
伺服器配置類常見問題
- 分析一個Group By語句異常原因
-
SQL_MODE
- 配置MySQL處理SQL的方式
set [session/global/persist] sql_mode="xxx"
- [mysqld] sql_mode=xxx
- 常用的SQL Mode
-
ONLY_FULL_GROUP_BY
對於group by聚合操作,如果出現在select中的列、having或group by子句的非聚合列,沒有在group by出現,那麼SQL語法檢查報錯。 -
ANSI_QUOTES
禁止用雙引號來引用字串 -
REAL_AS_FLOAT
Real作為float的同義詞 -
PIPES_AS_CONCAT
將||
視為字串的連結操作符而非或運算子 -
STRICT_TRANS_TABLES/STRICT_ALL_TABLES
在事務儲存引擎/所有儲存引擎啟用嚴格模式出現,那麼SQL語法檢查報錯 -
ERROR_FOR_DIVISION_BY_ZERO
不允許0作為除數 -
NO_AUTO_CREATE_USER
在使用者不存在時不允許grant語句自動建立用 -
NO_ZERO_IN_DATA/NO_ZERO_DATE
日期資料內/日期資料不能含0 -
NO_ENGINE_SUBSTITUTION
當指定的儲存引擎不可用時報錯
-
-
- 如何比較系統執行配置和配置檔案中的配置是否一致
- 使用set命令配置動態引數, session隻影響當前session的配置;global會對整個mysql的配置產生影響,並不會當前的session進行修改;在mysql8.0版本中persist會對全域性變數修改,並在mysql資料目錄中生成一個新的資料配置檔案,mysqld_auto.cnf檔案,同樣記錄了全域性變數值修改,下次mysql重啟,會對mysqld_auto.cnf檔案內容對配置命令進行配置。
set [session | @@session] system_val_name=expr
set [global | @@global] system_val_name=expr
set [persist | @@persist] system_val_name=expr
- 使用pt-config-diff 工具比較配置檔案
pt-config-diff u=root,p=123456,h=localhost /etc/my.cnf
- 使用set命令配置動態引數, session隻影響當前session的配置;global會對整個mysql的配置產生影響,並不會當前的session進行修改;在mysql8.0版本中persist會對全域性變數修改,並在mysql資料目錄中生成一個新的資料配置檔案,mysqld_auto.cnf檔案,同樣記錄了全域性變數值修改,下次mysql重啟,會對mysqld_auto.cnf檔案內容對配置命令進行配置。
- MySQL中關鍵效能引數
-
max_connections
設定MySQL允許訪問的最大連結數量 -
interactive_timeout
設定互動連線的timeout時間 -
wait_timeout
設定非互動連線的timeout時間 -
max_allowed_packet
-
sync_binlog
表示每寫多少次緩衝會向磁碟同步一次binlog -
sort_buffer_size
設定每個會話使用的排序快取區的大小 -
join_buffer_size
設定每個會話使用的連線緩衝的大小 -
read_buffer_size
指定了一個對MYISAM進行表掃描時所分配的讀快取池的大小 -
read_rnd_buffer_size
設定控制索引緩衝區的大小 - 以上引數是對每個執行緒進行分配的,如果有100個連線,那麼可能就會分配100以上分配的記憶體大小,如果引數設定過大,可能會導致記憶體浪費或記憶體溢位
- 基於會話引數配置
-
binlog_cache_size
設定每個會話用於快取未提交事務快取大小 - 基於儲存引擎的配置
-
innodb_flush_log_at_trx_commit
0:每秒進行一次重做日誌的磁碟重新整理操作。1:每次事務提交都會重新整理日誌到磁碟中。2:每次事務提交寫入系統快取每秒想磁碟重新整理一次 -
innodb_buffer_pool_size
設定Innodb緩衝池的大小,應為系統可用記憶體的75% -
innodb_buffer_pool_instances
設定Innodb快取示例個數,每個例項大小為總緩衝池大小/示例個數。 -
innodb_file_per_table
設定每個表獨立使用一個表空間檔案
-
日誌類常見問題
常用的MySQL日誌有哪些?什麼情況下使用這些日誌
MySQL常用日誌型別
- 錯誤日誌(error_log) 記錄mysql在啟動、執行、停止時出現的問題
- 使用場景
- 分析排除MySQL執行錯誤
- 記錄未經授權的訪問
- 配置引數
-
log_error = $mysql/sql_log/mysql-error.log
錯誤日誌的存放路徑 -
log_error_verbosity = [1,2,3]
定義錯誤日誌的級別:1表示Error messages 2表示Error and warning messages 3表示Error、warning、愛你的note mesages -
log_error_services=[日誌服務元件;日誌服務元件]
mysql8.0版本中的引數- 常用的mysql自帶的日誌組建
-
log_filter_internal
預設日誌過濾元件,依賴log_error_verbosity -
log_sink_internal
預設的日誌輸出元件,依賴log_error -
log_sink_json
將錯誤日誌輸出到json檔案- 安裝元件:
install component ‘file://component_log_sink_json';
- 設定日誌元件服務:
set persist log_error_services=' log_sink_json';
- 安裝元件:
-
log_sink_syseventlog
將錯誤日誌輸出到系統日誌檔案
-
- 預設mysql使用的是UTC時區,怎麼讓mysql使用系統的使用時間
- 檢視當前mysql使用的時區:
select @@log_timestamps
- 設定mysql使用系統時間:
set persist log_timestamps='SYSTEM'
- 檢視當前mysql使用的時區:
- 常用的mysql自帶的日誌組建
-
- 使用場景
- 常規日誌(general_log) 記錄所有發向MySQL的請求
- 引數配置
general_off=[ON|OFF]
general_log_file=$mysql/sql_log/general.log
log_output=[FILE|TABLE|NONE]
- 慢查詢日誌(slow_query_log) 記錄符合條件的查詢,找到需要優化的SQL
- 引數配置
-
slow_query_log=[ON|OFF]
是否開啟慢查詢日誌 -
slow_query_log_file=$mysql/sql_log/slowlog.log
慢查詢日誌存放路徑 -
long_query_time=xxx秒
預設是10秒;設定SQL執行超過此時間的SQL記錄下來 -
log_queries_not_using_indexes=[ON|OFF]
若為ON,則記錄所有SQL沒有使用索引的SQL語句日誌 -
log_slow_admin_statements=[ON|OFF]
預設為OFF 把管理命令記錄到慢查詢日誌 -
log_slow_slave_statememts=[ON|OFF]
把主從複製中主的sql在從庫執行時,才會記錄
-
- 引數配置
- 二進位制日誌(binary_log) 記錄全部有效的資料修改日誌,基於時間點的備份和恢復,主從複製
- 怎麼把二進位制日誌檔案變成人能讀懂的格式
mysqlbinlog --no-defaults -vv --base64-outpus=DECODE_ROWS $mysql/sql_log/mysql-bin.0001
- 引數配置
-
log-bin [=base_name]
只能在配置檔案中修改,並重啟才會生效,base_name二進位制檔案的目錄和字首 -
binlog_format=[ROW|STATEMENT|MIXED]
二進位制日誌格式,MySQL5.7後預設使用ROW格式 -
binlog_row_image=[FULL|MINIMAL|NOBLOB]
預設為FULL,二進位制日誌ROW格式副格式 -
binlog_rows_query_log_events=[ON|OFF]
預設為OFF,在row格式二進位制檔案記錄實際需要的SQL,需要把這個引數設定為ON -
log_slave_updates=[ON|OFF]
預設為OFF,在主從架構模式下,slave伺服器上的二進位制日誌並不會記錄從主同步過來的二進位制內容 -
sync_binlog=[1|0]
MySQL5.7後預設為1,二進位制日誌如何重新整理磁碟; 0表示mysql並不會主動重新整理日誌到磁碟而由作業系統自己控制,1表示每寫一次二進位制日誌就重新整理磁碟 -
expire_logs_days=days
設定二進位制日誌的過期時間 - 手動清理二進位制檔案
-
PURGE BINARY LOGS TO 'mysql-bin.010';
清理mysql-bin.010之前的日誌全部刪除 -
PURGE BINARY LOGS BEFORE '2008-04-22 22:46:26';
清理時間2008-04-22 22:46:26之前的二進位制日誌檔案
-
- 怎麼把二進位制日誌檔案變成人能讀懂的格式
- 中繼日誌(relay_log) 用於主從複製,臨時儲存在主從庫同步的二進位制日誌
- 引數配置
-
relay_log=filename
中繼日誌的目錄和字首 -
relay_log_purge=[ON|OFF]
預設為ON,是否開啟對relay_log的自動清除
-
- 引數配置
如何通過日誌來審計使用者活動
儲存引擎類常見問題
瞭解的MySQL儲存引擎及適用場景
MyISAM儲存引擎
- MySQL5.6之前的預設引擎,最常用的非事務性儲存引擎;適用場景讀操作大於寫操作的場景
- 特點:
- 非事務性儲存引擎
- 以堆表方式儲存
- 使用表級鎖
- 支援Bree索引,空間索引,全文索引
- 檢查MyISAM表的狀況
-
check table myisam的表名
檢查MyISAM表的狀況 -
repair table myisam引擎的表名
修復myisam引擎的表 -
myisampack -b -f 表名
壓縮myisam引起的表
-
CSV儲存引擎
- 以CSV格式儲存的非事務性儲存引擎;作為資料交換的中間表
- 特性
- 資料以csv格式儲存
- 所有列都不能為null
- 不支援索引
Archive儲存引擎
- 只允許查詢和新增資料而不允許修改的非事務性儲存引擎;場景:適用於日誌或資料採集類引用;資料歸檔儲存
- 特點
- 表資料使用zlib壓縮
- 只支援Insert和Select
- 只允許在自增ID上建立索引
Memory儲存引擎
- 是一種易失性非事務儲存引擎,儲存在記憶體中,斷電易丟失;場景:用於換成字典對映表;快取週期性分析資料
- 特點:
- 資料儲存在記憶體中,讀寫速度很快,資料易丟失
- 所有欄位長度固定
- 支援Btree和Hash索引,預設是Hash索引
InnoDB儲存引擎
- 最常用的事務性儲存引擎;適用場景:大多數OLTP場景
- 特點:
- 資料按主鍵聚集儲存
- 支援行級鎖以及MVCC(多版本併發控制)
- 支援Btree和自適應Hash索引
- MySQL5.6後支援全文索引和空間索引
NDB儲存引擎
- MySQL叢集所使用的記憶體性事務儲存引擎;場景:需要資料完全同步的高可用場景
- 特點:
- 資料儲存在記憶體中
- 支援行級鎖
- 支援高可用叢集
- 支援Ttree索引
什麼情況下InnoDB無法線上修改表結構
- 加全文索引
CREATE FULLTEXT INDEX name ON table(column)
- 加空間索引
ALTER TABLE geom ADD SPATIAL INDEX(g)
- 刪除主鍵
ALTER TABLE tbl_name GROP PRIMARY KEY
- 增加自增列
ALTER TABLE add COLUMN id int AUTO_INCREMENT NOT NULL PRIMARY key
- 修改列型別
ALTER TABLE tbl_name CHANGE c1 c1 NEW_TYPE
- 修改字符集
ALTER TABLE tbl_name CHANGE SET = charset_name
線上DDL存在的問題
- 有部分語句不支援線上DDL
- 長時間對DDL操作會引起嚴重的主從延遲
- 無法對DDL操作進行資源限制
在無法進行線上修改表結構的情況下,要如何操作
如何更安全的執行DDL
pt-online-schema-change [OPTIONS] DSN
- 示例
pt-online-schema-change --alter "add column modified_time timestamp" --excute D=stock,t=stock,u=dba,p=123456
InnoDB是如何實現事務的
事務的定義
- 事務要保證一組資料庫操作,要麼全部成功,要麼全部失敗
事務的特點
-
A(Atomicity) 原子性
回滾日誌(Undo log)用於記錄修改前的狀態 -
C(Consistency) 一致性
重做日誌(Redo log):用於記錄資料修改後的狀態 -
I(Isolation) 隔離性
鎖:用於資源隔離- 鎖的分類:
- 鎖的屬性: 共享鎖和排它鎖
- 鎖的粒度:頁鎖、表鎖,行鎖
- 鎖的狀態:意向共享鎖、意向排它鎖
-
D(Durability) 永續性
重做日誌(Redo log)+(Undo log)
InnoDB讀操作是否會阻塞寫操作
- 查詢需要對資源加共享鎖(S)
- 資料修改需要對資源加派它鎖(X)
MySQL架構類常見問題
My SQL的主從複製是如何工作的
-
MySQL主從複製的實現原理
- 主資料庫開啟二進位制日誌(binary log)
- 從服務會啟動一個IO程序,配置完成,並和主庫建立連結,主庫啟動一個特殊的二進位制程序binlog_dump
- 從伺服器的IO_Thread執行緒會從指定位置讀取主伺服器的binary log並寫到中繼日誌(relay log)
- 從伺服器的sql_thread會從relay log讀取或重放到從庫中
-
MySQL主從複製的配置步驟
## 在master伺服器上的操作
# 0、檢視主從伺服器的MySQL資料庫版本是否一致
mysql> select @@version;
# 1、開啟binlog和gtid(可選)
# 檢視binlog是否開啟
mysql> show variables like 'log_bin%';
# 檢視是否開啟gtid
mysql> show variables like 'gtid_mode';
# 如果配置gtid模式,在/etc/my.cnf檔案中需要配置gtid相關的引數
default_authentication_plugine='mysql_native_passwd' 在使用MMM和MHA和MGR需要使用此配置
enforce-gtid-consistency
log-slave-updates = on
master_info_repository=TABLE
relay_log_info_repository=TABLE
# 2、建立同步所用的資料庫賬號
# 建立複製賬號
mysql> create user repl@'ip.%' identified by 'passwd';
# 授權複製賬號
mysql> grant replication slave on *.* to repl@'ip.%';
# 3、適用master_data引數備份資料庫
~$ mysqldump --single-transaction -uroot -p --routines --triggers --events --master-data=2 --all-databases > master.sql
# 4、把備份危機傳輸到slave伺服器
$ `scp master.sql root@ip:/root` 把master.sql拷貝到slave的root目錄下
## 在slave伺服器上的操作
# 1、開啟binlog(可選)開啟gtid(可選)
# 2、恢復master上的備份資料庫
$ mysql -uroot -p < /root/master.sql
# 3、適用change master配置鏈路(配置io執行緒連結master例項需要的引數)
mysql> change master to master_host='主庫ip', master_log_file='mysql-bin.000012', master_log_pos=710; 這個master_log_file和master_log_pos偏移量可以在master.sql中看到
# 4、適用start slave啟動複製
# 啟動從庫
mysql> start slave user='repl' passwd='passwd';
# 檢視slave的狀態
mysql> show slave status;
### 半同步複製
# 在master伺服器上
# 檢視是否安裝同步外掛
mysql> show plugins;
# 安裝半同步外掛
mysql> install plugin rpl_semi_sync_master;
# 檢視半同步相關的變數
mysql>show variables like 'rpl%';
# 設定半同步的超時時間
mysql> set persist rpl_semi_sync_master_timeout=500;
# 啟動半同步複製
mysql>set persist rpl_semi_sync_master_enabled=on;
# 在slave伺服器上
# 需要檢視從伺服器上是否安裝版同步外掛
# slave安裝半同步服務外掛
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
# 檢視slave的半同步引數
mysql> show variables like 'rpl%';
# 設定slave的半同步引數
mysql> set persist rpl_semi_sync_slave_enabled=on;
# 啟動slave的io執行緒
mysql> start slave io_thread user='repl' passwd='passwd';
# 檢視slave狀態
mysql> show slave status \G;
# 檢視master半同步的狀態
mysql> show global status like 'rpl%';
# 檢視slave半同步的狀態
mysql> show global status like 'rpl%';
比較一下基於GTID方式的複製和基於日誌點的複製
-
什麼是基於日誌點的複製
- 傳統的主從複製方式
- slave請求master的增量日誌依賴日誌偏移量
- 配置鏈路是需要指定master_log_file和master_logs_pos引數
-
什麼是基於GTID的複製
-
GTID=source_id:transaction_id
是全域性事務id的縮寫;source_id是主機的uuid,transcation_id是事務的id - slave增量同步master的資料依賴於未同步的事務ID
- 複製鏈路時,slave可以根據已經同步的事務ID繼續進行自動同步。
-
-
這兩種複製方式的各自特點
- 基於日誌複製,相容性好;基於GTID同老版本的MySQL和MariaDB不相容
- 基於日誌複製,支援MMM和MHA架構;基於GTID僅支援MHA架構
- 基於日誌複製,主備切換後很難找到新的同步點;基於GTID複製,可以很方便的找到未完成同步的事務ID
- 基於日誌複製,可以方便跳過複製錯誤;基於GTID複製,只能通過置入空事務的方式跳過錯誤
比較一下MMM和MHA兩種高可用架構的優缺點
-
MMM和MHA兩種架構的作用
- 對主從複製中的master例項進行健康監控
- 當master宕機後把寫VIP(虛擬ip)遷移到新的master
- 重新配置叢集中的其他slave對新的master同步
-
MMM適用的主從複製架構
-
MMM架構的故障轉移步驟
- slave伺服器上操作
- 完成原主上已複製日誌的恢復
- 使用change master命令配置新主
- 主備伺服器上的操作
- 設定read_only=off
- 遷移寫vip到新主伺服器
- MMM架構需要的資源
- 主DB, 2個,用於主備模式的主主複製配置
- 從DB,0-N個,用於配製0臺或多臺從伺服器
- IP地址,2n+1個,N為MySQL伺服器的數量
- 監控使用者,1個,用於監控資料庫狀態的MySQL使用者(replication client)
- 代理使用者,1個,用於MMM的agent端用於改變read_only狀態(super,replication,client,process)
- 複製使用者,1個,用於配製MySQL複製的MySQL使用者(replication slave)
- slave伺服器上操作
-
MMM架構的配置步驟
# 配置主主複製的叢集架構
# 按照centos的yum擴充套件包
# 安裝所需的perl包
# 安裝MMM工具包
# 配置並啟用MMM服務
MMM架構的優點
- 提供了讀寫vip的配置,使讀寫請求都可以達到高可用
- 工具包相對完善,不需要額外的開發指令碼
- 故障轉移後,可以持續對MySQL叢集進行高可用監控
MMM架構的缺點
- 故障切換簡單粗暴容易丟事務,解決方法:主備用半同步複製
- 不支援GTID的複製方式
- 自行修改perl指令碼實現
- 社群不活躍,很久不更新版本,維護難
MHA適用的主從複製架構
MHA架構的故障轉移步驟
- 選舉最新更新的slave
- 嘗試從宕機的master儲存二進位制日誌
- 應用差異的中繼日誌到其他slave
- 應用從master儲存的二進位制日誌
- 選舉新的slave為新的master
- 配置其他slave向新的master同步
MHA架構的資源
- 主DB, 1個,用於初始主從服務的Master伺服器
- 從DB,2到N個,可以配置2臺或多臺從伺服器
- IP地址,n+2個,N為MySQL伺服器的數量
- 監控使用者,1個,用於監控資料看狀態的MySQL使用者(all privileges)
- 複製使用者, 1個,用於配製MySQL複製的MySQL使用者(replication slave)
MHA架構的配置步驟
* 配置一主多從的複製架構
* 按照centos的yamu擴充套件源及依賴包
# 到https://dl.fedoraproject.org/pub/epel/下載對應系統的rpm包
$ wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# 安裝rpm包,安裝的目錄存放在/etc/yum.repos.d目錄下
$ rpm -ivh epel-release-latest-7.noarch.rpm
# 把epel.repo的包校驗關閉,把gpgcheck改為1
gpgcheck=1
* 配置叢集內各主機的ssh免認證
# 配置ssh
$ ssh-keygen
# 把伺服器的ssh的公鑰拷貝到其他伺服器
$ ssh-copy-id -i /root/.ssh/id_rsa root@ip
* 在各節點安裝mha_node軟體
# 安裝MHA依賴包
$ yum install -y perl-DBD-MySQL ncftp perl-DBI.x86
# 安裝MHA軟體包
$ rpm -ivh mha4mysql-node-0.57-0.el7.noarch.rpm
* 在管理節點安裝mha_manager
# 安裝MAH管理節點依賴包
$ yum install -y perl-Config-Tiny.noarch perl-Time-HiRes.x86_64 perl-Paraller-ForkManager perl-Log-Dispatch-Perl.noarch
# 安裝MHA管理節點包
$ rpm -ivh mha4mysql-manager-0.57-0.el7.noarch.rpm
* 配置並啟動MHA管理程序
# 配製master伺服器的mha賬戶並授權
mysql> create user dba_mha@'192.168.1.%' identified by '123456';
mysql> grant all privileges on *.* to dba_mha@'192.168.1.%';
# 建立mha的目錄和檔案
$ mkdir /etc/mha && touch mysql-mha.conf
# 配置引數如下:
[server default]
user=dba-mha
password=123456
manager_workdir=/home/mha
manager_log=/home/mha/manager.log
remote_workdir=/home/mha
ssh_user=root
repl_user=repl
repl_password=123456
ping_interval=1
master_binlog_dir=/home/mysql/sql_log
ssh_port=22
master_ip_failover_script=/usr/bin/master_ip_failover
secondary_check_script=/usr/bin/masterha_secondary_check -s 192.168.1.91 -s 192.168.192 -s 192.168.1.93
[server1]
hostname=192.168.1.91
candidate_master=1
[server2]
hostname=192.168.1.92
candidate_master=1
[server3]
hostname=192.168.1.93
no_master=1
#啟動mha服務
$ nohup masterha_manager --conf=/etc/mha/mysql-mha.conf &
MHA架構的優點
- 支援GTID的複製方式和機遇日誌點的複製方式
- 可以多個slave中選舉最合適的新master
- 會嘗試從舊master中儘可能多的儲存為同步日誌
MHA架構的缺點
- 未能獲取到舊主未同步的日誌,解決方法:使用半同步複製
- 需要自行開發寫vip轉移指令碼
- 只監控master而沒有對slave實現高可用
如何減小主從複製的延遲
- 主從複製延遲產生的原因
- 主資料庫的大事務操作
- 主從伺服器之間的網路延遲
- io執行緒順序寫入relay log 過程,影響比較小
- sql thread讀寫relay log過程中
- 減小主從延遲的處理方法
- 化大事務為小事務,分批更新資料
- 使用
pt-online-schema-change
工具對DDL操作 - 網路延遲
- 減少單詞事務處理的資料量已減少產生的日誌檔案大小
- 減少主上所同步的slave的數量
- 由於主上多執行緒的寫入,從上單執行緒恢復所引起的延遲
- 適用MySQL5.7後的多執行緒複製
- 適用MGR複製架構
說下對MGR的認識
- 什麼是MGR複製
- MGR(MySQL group Replication)
- 是官方推出的一種基於Paxos協議的複製
- 是一種不同於非同步複製的多master複製叢集
- MGR複製架構
- MGR兩種模式
-
group_replication_single_primary_mod=[ON|OFF]
on是單主模式,off上多主模式 - 單主模式 預設的工作模式
- 多主模式
-
MGR複製架構的配置步驟
# 安裝group_replication外掛
mysql> install plugin group_replication soname 'group_replication.so';
# 在第一個例項上建立複製使用者
mysql> create user repl@'192.168.1.%' identified by '123456';
mysql> grant replication slave on *.* to repl@'192.168.1.%';
# 配置第一組例項
# 檢視主主複製的變數
mysql> show variables like 'group_replication%';
mysql>show varialbes like 'transcation_write_set_extraction';
# 修改事務的加密演算法為XXHASH64
mysql>set perisist transcation_write_set_extraction='XXHASH64';
#
mysql> show variables like 'binlog_checksum';
mysql> set persist binlog_checksum=none;
# 對主複製節點設定一個名字
mysql> show variables like 'group_replication_group_name';
mysql>select uuid();
mysql> set persist group_replication_group_name='aaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa';
mysql>show variables like 'group_replication_local_address';
mysql> set persist group_replication_local_address=33061;
mysql> set global group_replcation_bootstrap_group=on; 在主伺服器啟動後設置為off
# 啟動主伺服器
mysql> start group_replication;
# 把其他例項加入組
修改/etc/my.conf配置檔案的引數,如下
# group replication specific options
plugin-load=group_replication.so
group_replication=FORCE_PLUS_PERMANENT
transaction-write-set-extraction=XXHASH64
loose-group_replication_start_on_boot=OFF
loose-group_replication_bootstarp_group=OFF
loose-group_replication_group_name='aaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
group_replication_local_address='本機ip:33061'
group_replication_group_seeds='主節點ip:33061'
binlog_checksum=NONE
# 重啟mysql例項
# 啟動從伺服器節點
mysql> change master to master_user='repl', master_password='123456' for channel 'group_replication_recovery';
mysql> start group_replication;
# 檢視複製的成員表
mysql> use performance_schema;
mysql>show tables;
mysql>selelct * from replication_group_members\G;
MGR複製架構的優點
- Group replication組內成員基本無延遲
- 可以支援多謝、讀寫服務高可用
- 資料強一致性,可以保證不丟失事務
MGR複製架構的缺點
- 只支援InnoDB儲存引擎的表,並且每個表上必須要有一個主鍵
- 單主模式下很難確認下一個Primary
- 只能用在gtid模式下的複製形式,且日誌格式必須為row。
MGR複製架構的適用場景
- 對主從延遲十分敏感的應用場景
- 希望對讀寫提供高可用場景
- 希望可以保證資料強一致的場景
如何解決資料庫讀/寫負載大的問題?
如何解決讀負載大的問題
- 增加slave伺服器,讀寫分離、通過客戶端實現或者資料庫中介軟體(MyCAT/ProxySQL/Maxscale)
如何解決寫負載大的問題
- 資料庫中介軟體(MyCAT/ProxySQL/Maxscale) 進行分庫分表
MySQL備份恢復類常見問題
如何對資料庫進行備份
-
備份方式
- 邏輯備份和物理備份
- 全量備份和增量備份
-
常用的備份工具
-
mysqldump 最常用的邏輯備份工具,支援全量備份和條件備份
- mysqldump的優點
- 備份結果為可讀SQL檔案,用於跨版本跨平臺恢復資料
- 備份檔案的尺寸小於物理備份,便於長時間儲存
- MySQL發行版自帶工具,無需安裝第三方軟體
- mysqldump的缺點
- 只能進行單執行緒執行備份恢復任務,備份恢復速度較慢
- 為完成一致性備份對備份表加鎖,容易造成阻塞
- 會對Innodb Buffer Pool造成汙染
- mysqldump例項
-
mysqldump -uroot -p --database stock > stock.sql
備份stock資料庫 -
mysqldump -uroot -p stock stock > stock.sql
對stock資料庫的stock表備份 -
mysqldump -uroot -p --master-data=2 --all-databases > all.sql
備份所有資料庫的二進位制日誌資訊 -
mysqldump -uroot -p --where "count>20" stock stock > stock.sql
備份stock庫stock表 count 大於20的資料
-
- mysqldump的優點
-
mysql恢復
-
mysql -uroot -p stock <stock.sql
恢復stock資料庫
-
-
mysqlpump 多執行緒邏輯備份工具,mysqldump的增強版本,最早在mysql5.7版本引入
- mysqlpump的優點
- 語法同mysqldump高度相容,學習成本低
- 支援基於庫和表的並行備份,可以提高邏輯備份的效能
- 適用ZLIB和Lz4演算法對備份進行壓縮
- mysqlpump的缺點
- 基於表進行並行備份,對於大表來說效能較差
- 5.7.11之前版本不支援一致性並行備份
- mysqlpump例項
-
mysqlpump --compress-output=zlib --set-gtid-purged=off --databases stock > stock.zlib
對所有資料庫進行zlib壓縮 備份 -
zlib_devompress stock.zlib stock.sql
解壓縮 -
mysql -uroot -p stock <stock.sql
恢復stock資料庫 -
mysqlpump --users --execlude-databases=sys,mysql,percona,stock --set-gtid-purged=off -uroot -p
只備份資料庫的賬號
-
- mysqlpump的優點
-
xtrabackup Innodb線上物理備份工具,支援多執行緒和增量備份
- xtrabackup的優點
- 支援Innodb儲存引擎的線上熱備份,對Innodb緩衝沒有影響。
- 支援並行對資料庫的全備和增量備份
- 備份和恢復效率比邏輯備份高
- xtrabackup的缺點
- 做單表恢復時比較複雜
- 完整的資料拷貝,備份檔案比邏輯備份大
- 對跨平臺和資料庫版本的備份恢復支援度不如邏輯備份
- xtrabackup示例
- yum install -y rsync numactl libaio libev
- yum install -y perl-DBD-MySQL.x86_x64 perl-DBI.x86 perl-Time-HiRes.x86_64 perl-IO-Socket-SSL.noarch perl-TermReadKey.x86_64
- rpm -ivh percona-xtrabackup-24-12-1.el7.x86_64.rpm
- innobackupex --user=root --password=123456 /home/db_backup
- innobackupex --user=root --password=123456 --parallel=2 /home/db_backup 20221127 --no-timestamp 多執行緒自定義備份檔名稱
- innobackupex --apply-log /home/db/_backup/20221127 備份恢復
- xtrabackup的優點
-
如何對MySQL進行增量備份和恢復
-
mysql -uroot -p stock < stock.sql
-
mysqlbinlog --start-position=337 --database=stock mysql-bin.000002 > stock_diff.sql
-
mysql -uroot -p stock <stock_diff.sql
-
innobackupex --user=root --password=pwd 全備目錄
xtrabackup全量備份 -
innobackupex --user=root --password=pwd --incremental 增量備份目錄 --incremental-basedir=上一次全量備份的目錄
xtrabackup增量備份 -
innobackupex --apply-log --redo-only 全備目錄
-
innobackupex --apply-log --redo-only 全備目錄 --incremental-dir=第1...N次增量目錄
-
innobackupex --apply-log 全備目錄
全量資料恢復 -
關閉mysql例項,把undo和data的舊目錄替換成新的
-
rm -rf data_old/ undo_old/
-
mv data data_old
-
mv undo_log undo_old
-
mkdir data undo_log
-
innobackupex --move-back 全備目錄
如何對binlog進行備份
- 備份方式
- 利用cp命令進行離線備份
- 適用mysqlbinlog命令線上實時線上備份
mysqlbinlog --raw --read-from-remote-server --stop-never --host 備份機ip --port=3306 -u repl --p xxxxx 啟動二進位制日誌檔名
MySQL管理及監控類問題
對MySQL進行過哪些監控
效能指標
-
QPS
資料庫每秒處理的請求數量- 方法一
show global status like 'Com%';
-
sum(com_xxx)
對上面com所有的數相加
- 方法二
show global status where like 'Queries'
QPS=(queries2-queries1)/時間間隔
- 示例
show global status where variable_name in ('Queries', 'uptime')
- 方法一
-
TPS
資料庫美妙處理的事務數量show global status where variable_name in ('com_start','com_delete', 'com_update');
Tc=com_insert+com_delete+com_update
TPS = (Tc2-Tc1)/(time2-time1)
-
併發數
資料庫當前併發處理的會話數量show global status like 'threads_running'
-
連線數
連線到資料庫會話的數量show global status like 'threads_connected'
-
快取命中率
Innodb的快取命中率(innodb_buffer_pool_read_requests - innodb_buffer_pool_reads) / innodb_buffer_pool_read_requests * 100%
-
innodb_buffer_pool_read_requests
表示從緩衝池讀取的次數 -
innodb_buffer_pool_pool_reads
從物理磁碟讀取的次數 -
innodb_buffer_pool_read_requests
讀取的總次數
功能指標
-
可用性
資料庫是否正常對外提供服務- 週期性連結資料庫伺服器並執行
select @@version;
mysqladmin -uxxx -pxxx -hxxxx ping
- 週期性連結資料庫伺服器並執行
-
阻塞
當前是否有阻塞的回話 -
死鎖
當前事務是否會產生死鎖pt-deadlock-logger u=dba,p=xxxx,h=127.0.0.1 --create-dest-table -dest u=dba,p=xxx,h=127.0.0.1,D=crn,t=deadlock
seet global innodb_print_all_deadlocks=on
-
慢查詢
實時慢查詢監控- 通過慢查詢日誌監控
- 通過
information_schema.'PROCESSLIST' 表實時監控
-
主從延遲
資料庫主從複製鏈路是否正常-
show slave status
檢視seconds_behind_master
這個值 - 啟動兩個執行緒
-
pt-heartbeat --user=xx --password=xxx -h master --create-table --database xxx --update --daemonize --interval=1
週期性更新監控表的值 -
pt-heartbeat --user=xx --password=xxx -h slave database crn --monitor --daemonize --log /tmp/slave_lag.log
查詢監控表的值
-
MySQL優化及異常處理
資料庫伺服器負載過大的問題
- 伺服器負載過大的原因
-
伺服器磁碟IO超負荷
-
iostat-dmx 1
- 慢查詢造成的磁碟IO爆表
- MySQL輸出大量日誌
- MySQL正在進行大批量寫
- 慢查詢產生了大量的磁碟臨時表
- show global status like '%tmp%' 檢視磁碟臨時表的數量
- 解決慢查詢造成的磁碟IO爆表問題
- 優化慢查詢,減少使用磁碟臨時表
- 增加temp_table_size和max_heap_table_size引數的大小
- 慢查詢造成的磁碟IO爆表
-
Isof
-
-
存在大量阻塞執行緒
- show processlist
- 阻塞監控
-
存在大量併發慢查詢
- show processlist
- 慢查詢日誌
-
存在其他佔用cpu的服務
- ps
- top
-
伺服器硬體資源原因
- 硬體監控
-
主從資料庫資料不一致
- 主從資料庫延遲為0
- IO_THREAD和SQL_THREAD狀態為yes
- 相同查詢在主從伺服器中的查詢結果不同
主從資料不一致的原因
- 對從伺服器進行了寫操作
- 使用了sql_slave_skip_counter或注入了空事務的方式修復錯誤
- 使用了statement格式的複製
針對主從資料不一致問題的,處理方法
- 在slave伺服器設定read_only=ON的許可權設定
- 設定super_read_only=on設定super使用者
- 使用row格式的複製
- 使用pt-table-sync修復資料
-
pt-table-sync --exec --charset=utf8 -- database=stock --table=stock --sync-to-master h=從庫ip,u=dba,p=password
在主庫執行
-
主伺服器連不上問題
- 主從伺服器網路是否通暢
- 是否存在防火牆,過濾了資料埠
- 複製鏈路配置的使用者名稱和密碼是否正確,是否有相應的許可權
主鍵衝突問題
- 跳過故障資料
- 使用gtid複製,只能使用空事務的方法
- 檢查主從資料一致性
- 或直接刪除從庫主鍵衝突資料
資料庫不存在
- 跳過故障資料
- 使用pt-table-sync修復資料
relay_log損壞
- 找到已經正確同步的日誌點
- 怎麼找正確同步的日誌點
-
show slave status \G
中兩個引數Relay_Master_Log_File
和Exec_Master_Log_Pos
-
- 怎麼找正確同步的日誌點
- 使用reset slave刪除relay_log
- 在正確同步日誌點後重新同步日誌