mysqldump導數據報錯權限不足
場景描述
mysqldump使用指定用戶導出數據庫數據時,報錯:'Access denied; you need (at least one of) the PROCESS privilege(s)


原因分析
mysqldump使用指定用戶導出數據時,需要賦予PROCESS權限。
解決方案
使用管理員帳戶給相應用戶授予PROCESS權限。
GRANT SELECT,PROCESS ON . TO ‘dump_user’@’%’;
FLUSH PRIVILEGES;
使用mysqlbinlog工具獲取binlog
本節介紹了獲取binlog方法。
本文以從彈性云主機ECS上拉取為例,其他環境下方法類似。
- 在ECS上安裝MySQL客戶端,詳情請參考安裝MySQL客戶端。
說明TaurusDB兼容社區MySQL 8.0及以上版本,請勿安裝8.0以下版本的版本的客戶端。
- 執行命令,下載binlog文件。
mysqlbinlog -hxxx -uxxx -Pxxx -pxxx binlog.xxxx --read-from-remote-server
mysqlbinlog的常用參數:
- h:數據庫host。
- u:用戶名。
- P:端口號。
- p:密碼。
- start-position:表示從指定的起始位置開始解析。
- start-datetime:表示從指定的時間開始解析。
- stop-position:表示解析到指定的位置。
- stop-datetime:表示解析到指定的時間。
- skip-gtids:跳過打印gtid_log_event。
- short-form:表示只顯示statements。
- result-file:將binlog解析生成sql文件。
- read-from-remote-server:遠程下載binlog(用于mysqlbinlog與數據庫服務端不再同一臺機器的情況)。
canal解析binlog報錯
場景描述
canal解析Binlog出現錯誤,導致拉取Binlog中斷,錯誤信息如下:
com.alibaba.otter.canal.parse.exception.CanalParseException: java.lang.NumberFormatException:- Caused by: java.lang.NumberFormatException: - at com.alibaba.fastsql.sql.parser.Lexer.integerValue(Lexer.java:2454)


原因分析
檢查TaurusDB的參數“binlog_rows_query_log_events”的值是否設置為1或 ON 。
- 目前canal只能支持ROW格式的Binlog增量訂閱。
- 當TaurusDB的參數“binlog_rows_query_log_events”的值設置為1或ON時,會在Binlog中產生Rows_query類型的event,此類event非ROW格式,一些場景下,會導致canal出現blank topic問題,引發Binlog解析失敗。
解決方案
將TaurusDB的參數“binlog_rows_query_log_events”的值修改為 OFF ,重啟中斷的canal任務。
使用mysqldump導出大表的注意事項
在使用mysqldump導出數據時,倘若添加–q(--quick) 參數時,select出來的結果將不會存放在緩存中,而是直接導出到標準輸出中。如果不添加該參數,則會把select的結果放在本地緩存中,然后再輸出給客戶端。
- 如果只是備份小量數據,足以放在空閑內存buffer中的話,禁用-q參數,則導出速度會快一些。
- 對于大數據集,如果沒辦法完全儲存在內存緩存中時,就會產生swap。對于大數據集的導出,不添加-q參數,不但會消耗主機的內存,也可能會造成數據庫主機因無可用內存繼而宕機的嚴重后果。
因此,如果使用mysqldump來備份數據時,建議添加-q參數。
導出示例:
mysqldump -uroot -p-P8635 -h192.168.0.199 --set-gtid-purged=OFF --single-transaction --flush-logs -q test t1 >t1**.sql**
mysqldump的6大使用場景的導出命令
背景描述
mysqldump是MySQL最常用的邏輯導入導出的工具,下面介紹幾種常見使用場景。
mysqldump選項解析
表 配置項說明
| 選項名稱 | 說明 |
|---|---|
| add-drop-table | 每個數據表創建之前添加drop數據表語句。 |
| events,E | 導出事件。 |
| routines,R | 存儲過程以及自定義函數。 |
| flush-logs | 開始導出之前刷新日志。 |
| no-create-db,n | 只導出數據,而不添加CREATE DATABASE語句。 |
| add-drop-database | 創建數據庫之前添加drop數據庫語句。 |
| no-create-info,t | 只導出數據,而不添加CREATE TABLE語句。 |
| no-data,d | 不導出任何數據,只導出數據庫表結構。 |
| set-gtid-purged=OFF | 不導出gtid相關語句。 |
| hex-blob | 使用十六進制格式導出二進制字符串字段。 |
場景描述
適用場景舉例如下。
- 導出db1、db2兩個數據庫的所有數據。
mysqldump -uroot -p -P 8635 -h 192.168.0.199 * --hex-blob --set-gtid-purged=OFF --single-transaction --order-by-primary --flush-logs -q --databases db1 db2 >db12.sql
- 導出db1庫的t1和t2表。
mysqldump -uroot -p -P 8635 -h192.168.0.199 --hex-blob --set-gtid-purged=OFF --single-transaction --order-by-primary --flush-logs -q --databases db1 --tables t1 t2 > t1_t2 .sql
- 條件導出,導出db1表t1中id=1的數據。
mysqldump -uroot -p -P 8635 -h192.168.0.199 --hex-blob --set-gtid-purged=OFF --single-transaction --order-by-primary --flush-logs -q --databases db1 --tables t1 --where='id=1'>t1_id.sql
- 導出db1下所有表結構,而不導出數據。
mysqldump -uroot -p -P 8635 -h 192.168.0.199 --no-data --set-gtid-purged=OFF --single-transaction --order-by-primary -n --flush-logs -q --databases db1 > db1 _table.sql
- 除db1下的表和數據外,其他對象全部導出。
mysqldump -uroot -p -h 192.168.0.199 -P8635 --set-gtid-purged=OFF -F -n -t -d -E -R db1> others.sql
增加表字段后出現運行卡頓現象
故障描述
當給MySQL實例的表中增加一個字段,出現系統無法訪問的現象。
解決方案
因增加表字段而引起數據庫出現性能問題,有可能是未對新增字段添加索引,數據量大導致消耗了大量的CPU資源。為此,提出如下建議恢復數據庫性能。
- 添加對應索引、主鍵。
- 優化慢SQL語句。
怎么解決執行mysqldump出現SET @@SESSION.SQL_LOG_BIN等SQL的問題
場景描述
新購買的天翼云云數據庫,執行mysqldump時,會出現如下如所示代碼。
圖 代碼顯示


故障分析
開啟了“gtid-mode=ON”參數。
如果一個數據庫開啟了GTID,使用mysqldump備份或者轉儲的時候,即使不是MySQL全庫(所有庫)備份,也會備份整個數據庫所有的GTID號。
解決方案
在TaurusDB數據庫進行導出備份和恢復的時候,需要注意是否啟用數據庫用GTID模式。
如果開啟,則在mysqldump數據時,應該在mysqldump命令加上參數“–set-gtid-purged=OFF”。
canal工具報錯權限不足
場景描述
在搭建canal環境,使用指定用戶從TaurusDB獲取Binlog時,啟動canal經常會報如下錯誤:'show master status' has an error! Access denied: you need (at least one of) the SUPER, REPLICATION CLIENT privilege(s) for this operation
完整報錯信息如下:
2021-01-10 23:58:32.964 [destination = evoicedc , address = /dbus-mysql:3306 , EventParser] ERROR com.alibaba.ot ter.canal.common.alarm.LogAlarmHandler - destination:evoicedc[com.alibaba.otter.canal.parse.exception.CanalParseEx ception: command : 'show master status' has an error!
Caused by: java.io.IOException: ErrorPacket [errorNumber=1227, fieldCount=-1, message=Access denied; you need (at least one of) the SUPER, REPLICATION CLIENT privilege(s) for this operation, sqlState=42000, sqlStateMarker=#] with command: show master status at com.alibaba.otter.canal.parse.driver.mysql.MysqlQueryExecutor.query(MysqlQueryExecutor.java:61)
原因分析
canal拉取Binlog時需要賦予REPLICATION SLAVE, REPLICATION CLIENT權限。
解決方案
使用管理員帳戶給相應用戶授予REPLICATION SLAVE, REPLICATION CLIENT權限。
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘canal’@’%’;
FLUSH PRIVILEGES;