1. 程式人生 > 其它 >mysql常見問題-學習筆記

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
  • MySQL中關鍵效能引數
    • max_connections 設定MySQL允許訪問的最大連結數量
    • interactive_timeout 設定互動連線的timeout時間
    • wait_timeout 設定非互動連線的timeout時間
    • max_allowed_packet
      控制MySQL可以接受的資料包的大小
    • 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'
  • 常規日誌(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)
  • 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的資料
    • 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 只備份資料庫的賬號
    • 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 備份恢復
如何對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引數的大小
      • 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_FileExec_Master_Log_Pos
  • 使用reset slave刪除relay_log
  • 在正確同步日誌點後重新同步日誌