發表文章

目前顯示的是 2016的文章

Percona Xtrabackup小筆記

Xtrabackup原理 Xtrabackup是基於InnoDB的crash-recovery機制來實現的,它複製InnoDB文件導致內部不一致,然後再對文件進行crash-recovery,以致於讓資料一致性並且是可用的資料庫。 完整備份 [root@mysql-course backup]# xtrabackup --user=root --password=pwd --host=127.0.0.1 \ --port=3306 --parallel=4 --compress --compress-threads=4 --target-dir=/opt/backup/full \ --backup 看到下列訊息表示備份正常完成 161109 20:48:54 Executing UNLOCK BINLOG 161109 20:48:54 Executing UNLOCK TABLES 161109 20:48:54 All tables unlocked 161109 20:48:54 [00] Streaming ib_buffer_pool to 161109 20:48:54 [00] ...done 161109 20:48:54 Backup created in directory '/opt/percona57/data' MySQL binlog position: filename 'mysql-bin.000243', position '872', GTID of the last change '4bb4a153-8312-11e6-95a9-0800278d81c7:1-691' 161109 20:48:54 [00] Streaming backup-my.cnf 161109 20:48:54 [00] ...done 161109 20:48:54 [00] Streaming xtrabackup_info 161109 20:48:54 [00] ...done xtrabackup: Transaction log of lsn (8312487) to (8312512) was copied. 1611

MySQL監控軟體MEM及PMM介紹

圖片
MySQL監控軟體: PMP(Percona Monitoring Plugin) :Percona之前的監控是以Plugin或Template的方式加載到其他的監控軟體上,他有支援Zabbix、Nagios和Cacti等3個常用的監控軟體,詳細的介紹可以參考官網: Percona Monitoring Plugins MEM(MySQL Enterprise Monitor) :官方提供的監控軟體,需購企業版才能使用此功能,可以監控DB內的狀況和InnoDB、NDB、Replication等的內容,另外還可以監控作業系統上的部份內容,例如硬碟、CPU、RAM、網路…等使用狀況,除了監控之外,還有Query Analyzer及發送告警功能,詳細的介紹參考官網: MySQL Enterprise Monitor PMM(Percona Monitoring and Management) :它是一個用於管理及監控MySQL及MongoDB效能的開源平台,它提供了對MyISAM、InnoDB、TokuDB和PXC/Glarera的監控,另外也提供了與MEM類似的Query Analytics的功能,可以檢視執行了哪些SQL指令,並對執行效能較差的語法進行優化;針對作業系統的部份也提供了硬碟、網路、CPU和RAM的監控,特別的是它提供了Context switches、Processes和interrupts的監控,Context Switches可以看到CPU上下切換文的狀況,Processes可以方便了解系統有多少程序在等待I/O,這3個是MEM沒有提供的。詳細內容參考官方: Percona Monitoring and Management 架構說明: MEM架構 MEM是由Java+Apache Tomcat+MySQL組成的監控軟體 主要安裝Service Manager(也可稱Monitor Server)它有內建一個Agent可以讓你遠端監控 或者是另外在MySQL Server上安裝Agent軟體,其差別在於能否搜集作業系統上的資訊,裝了Agent才能在作業系統上搜集資訊 而DB端的資訊會透過本機或Service Manager的Agent,連到DB裡的Performance Schema中搜集資訊,再儲存到Servi

MySQL systemd on Linux 7

過去在Linux 6系列上用tar包安裝MySQL,要設定成系統服務很簡單,只要把mysql.server放在/etc/init.d裡面即可: cp support-files/mysql.server /etc/init.d/mysqld 但在Linux 7系列中service的角色已被systemd給取代(雖然service還是能用),但要設開機自動啟動chkconfig就會有問題: [root@mysql-course support-files]# chkconfig --list mysqld Note: This output shows SysV services only and does not include native systemd services. SysV configuration data might be overridden by native systemd configuration. If you want to list systemd services use 'systemctl list-unit-files'. To see services enabled on particular target use 'systemctl list-dependencies [target]'. 所以可以的話,我還是盡量設法弄成Linux 7相容的方式比較好 看了手冊的教學:https://dev.mysql.com/doc/refman/5.7/en/server-management-using-systemd.html 實在是太高深莫測了,我功力還不到家,看不太懂阿 後來看這篇http://superuser.com/questions/384365/systemctl-enable-differs-from-systemctl-start-how的說明,試做一下: [root@mysql-course ~]# systemctl status mysqld.service mysqld.service Loaded: not-found (Reason: No such file or di

MySQL壓測軟體tpcc-mysql

安裝 直接在GitHub下載 wget https://github.com/Percona-Lab/tpcc-mysql/archive/faa06df608d8bd36d540b0fc0042fd33debbde0c.zip 或是用bazaar來下載 wget http://mirror.centos.org/centos/7/os/x86_64/Packages/bzr-2.5.1-14.el7.x86_64.rpm rpm install bzr-2.5.1-14.el7.x86_64.rpm # cd src/ # make 因為我是用tar檔安裝MySQL的,所以它在編譯過程一直會找不到相關的library  [root@mysql-course src]# make cc load.o support.o `mysql_config --libs_r` -lrt -o ../tpcc_load /usr/bin/ld: cannot find -lperconaserverclient collect2: error: ld returned 1 exit status make: *** [../tpcc_load] Error 1 爬了文說直接設定: export LD_LIBRARY_PATH=/opt/percona57/lib export C_INCLUDE_PATH=/opt/percona57/include/ export MYSQL_HOME=/opt/percona57 export PATH=$MYSQL_HOME/bin:$PATH 就可以解決,但我試了就是沒辦法,於是查了一下mysql_config裡的設定 [root@mysql-course src]# mysql_config --libs           [-L/opt/percona57/lib/mysql -lperconaserverclient -lpthread -lz -lm -lrt -lssl -lcrypto -ldl]         --libs_r         [-L/opt/percona57/lib/mysql -lperconaserverclient -lpthread

Percona TokuDB 備份

圖片
安裝備份 ps_tokudb_admin --enable-backup 執行安裝程序時,它會去檢測一些項目,但如jemalloc, transparent huge pages..等,這些是在安裝TokuDB引擎時就已設定過的,大致上不會有什麼問題。 要注意的地方是要記得在參數檔的[mysqld_safe]區塊中加入 preload-hotbackup 這個參數,否則安裝時會報錯。 執行備份 set tokudb_backup_dir='/path/to/backup_dir'; 是的,沒看錯,這個看似設定備份路徑的語法就是在執行備份 我個人是覺得有點莫名奇妙啦XDD 它會自動的幫你把資料庫中所有的檔案備份到指定的路徑中 如果你的tokudb有另外放在其他路徑下的話,也分開備份在不同目錄下,如圖所示: 還原 目前只支援用rsync或cp的方式把資料還原回來,要注意的是,還原前切記先把mysqld服務先停止。 經測試,如果是資料移失的那種部份還原的話,還是可以在mysqld服務啟動時,透過rsync的方式把資料還原回來,如下圖: 如果是整個刪除的話,則需要關機還原,然後把每個檔案都還原回去 rsync -avrP /opt/backup/08311600/mysql_data_dir/ /opt/percona57/data/ rsync -avrP /opt/backup/08311600/tokudb_data_dir/ /opt/percona57/tokudb_data/ rsync -avrP /opt/backup/08311600/tokudb_log_dir/ /opt/percona57/tokudb_log/ 如下圖: 錯誤排除 在執行備份時,有可能會發生這個錯誤訊息: ERROR 1231 (42000): Variable 'tokudb_backup_dir' can't be set to the value of '/opt/backup/08311600' 這個有可能是因為備份路徑的權限不足,或是已有檔案存在無法寫入…  可以執行:SELECT @@tokudb_backup_last_error_string;查明錯誤原因

Percona TokuDB初試

圖片
◆ 緣起 最近在做個專案,它是一個報表系統 本來要用EDB(Postgres)但它的授權計算下來簡直是天價 所以又找了Greenplum要來做,測試後發現速度也無法滿足要求 最後想用MySQL的方案來試試。 ◆ 關於TokuDB 它的詳細說明,就不一一細數,有興趣直接到官網  Percona 簡單來說呢,是一個高效能、高壓縮比支援ACID和MVCC的儲存引擎,非常適合用在寫密集型且日誌型的應用場景。 在官方的部落中有做了一個 The MySQL Archive Storage Engine-Alternatives 對MyISAM、InnoDB、Archive和TokuDB的比較 在這些表中分別插入約2千萬筆的資料,其壓縮比如下: Engine Compression Table size [MB] InnoDB  none  2272 InnoDB  KEY_BLOCK_SIZE=8  1144 InnoDB  KEY_BLOCK_SIZE=4  584 MyISAM  none  1810 MyISAM  compressed with myisampack  809 Archive  default  211 TokuDB  ZLIB  284 TokuDB  LZMA   208 此表引用於Percona官方部落格 當然會有些限制內容,詳細就到官網上去看看 ◆ 安裝 手冊裡寫說可以單獨下載TokuDB的plugin,並安裝在MySQL或MariaDB的資料庫中,我這次是直接用Percona Server原生的資料庫,所以就包含在整個tar包裡了。 安裝前 記得有幾個設定要先處理,否則在啟動的時候會發生錯誤 libjemalloc library TokuDB需要libjemalloc 3.3.0以上的版本,如果是用tar包安裝的話,可以直接在lib/mysql/找到libjemalloc.so檔案,並且設定在my.cnf中: [mysqld_safe] malloc-lib=/opt/percona57/lib/mysql/libjemalloc.so Transparent huge pages 可以用指令先檢查目前OS上的設定是什麼: # cat /sys/kernel/

MySQL InnoDB鎖定的那些事

Shared and Exclusive Locks InnoDB標準是使用row-level鎖定,其中又有分2種鎖定類別 shared(S) locks和exclusive(X) locks shared(S) lock允許交易持有讀取行的鎖 exclusive(X) lock允許交易持有更新或刪除行的鎖 如果今天有筆交易T1持有s鎖在資料行r,此時有另一個交易T2也要對資料行r進行鎖定時,情況如下: 如果T2也是使用S鎖定則可立即執行,此時T1和T2對資料行r同時擁有s鎖定。 如果T2是使用 X 鎖定,則無法立即執行 另外,如果今天T1持有X鎖在資料行r,此時T2要對資料行r進行S鎖或X鎖時,則無法立即執行,須等到T1解除鎖定行T2才能對資料行r進行鎖定。 Intention Locks InnoDB支援多粒度鎖定允許row-level鎖定和整表鎖定共存於同張資料表中,為實現多粒度鎖定會額外使用一稱為intention locks的鎖定,此意圖鎖在InnoDB資料表中為table-level lock,用來指示此交易在資料表中的某行之後會使用哪種類型的鎖定(Shared或Exclusive),它也有兩種鎖定類型: Intention shared (IS):交易T意圖在資料表a各別資料行上持有S鎖 Intention exclusive (IX):交易T意圖在某些資料行上持有X鎖 例如:SELECT ... LOCK IN SHARE MODE會設定IS鎖,SELECT ... FOR UPDATE設定IX鎖。 Intention Lock的協議如下: 一個交易在資料表a中的一資料行獲得S鎖之前,必須先取得a資料表的IS鎖或更強的鎖 一個交易在獲得一資料行的X鎖之前,必須先取得a資料表的IX鎖 總結如下表: X IX S IS X 衝突 衝突 衝突 衝突 IX 衝突 相容 衝突 相容 S 衝突 衝突 相容 相容 IS 衝突 相容 相容 相容 在相容的情況下允許在現有的鎖中被授予其他的鎖定,而衝突的情況下則需等待前一個鎖定釋放後,才能對此進行鎖定,否則會發生死鎖或錯誤。 因此,意圖鎖定不會阻止除全表請求任何東西(例如,LOCK TABLES... WRITE),其主要目的是

MySQL Router 設定檔說明

設定檔範例:       [DEFAULT] logging_folder  = /opt/mysql-router/log plugin_folder   = /opt/mysql-router/lib/mysqlrouter runtime_folder  = /opt/mysql-router/run config_folder   = /opt/mysql-router [logger] level = INFO ## these section are only for standalone [routing:read_write] bind_address    = 192.168.56.107 bind_port       = 7001 destinations    = 192.168.56.102:3306,192.168.56.102:3307 mode            = read-write connect_timeout    = 5 max_connections   = 100 [routing:read_only] bind_address    = 192.168.56.107 bind_port       = 7002 destinations    = 192.168.56.102:3308,192.168.56.102:3309 mode            = read-only connect_timeout    = 1 max_connections   = 100 ## these section are used for Fabric [fabric_cache:my_fabric] address    = 192.168.56.101 user         = fabric [routing:fabric_rw] bind_port       = 7001 mode            = read-write destinations    = fabric+cache://my_fabric/group/mygroup1 [routing:fabric_ro] bind_port       = 7002