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客户端。
说明GaussDB(for MySQL)兼容社区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)
原因分析
检查GaussDB(for MySQL)的参数“binlog_rows_query_log_events”的值是否设置为1或 ON 。
- 目前canal只能支持ROW格式的Binlog增量订阅。
- 当GaussDB(for MySQL)的参数“binlog_rows_query_log_events”的值设置为1或ON时,会在Binlog中产生Rows_query类型的event,此类event非ROW格式,一些场景下,会导致canal出现blank topic问题,引发Binlog解析失败。
解决方案
将GaussDB(for MySQL)的参数“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号。
解决方案
在GaussDB(for MySQL)数据库进行导出备份和恢复的时候,需要注意是否启用数据库用GTID模式。
如果开启,则在mysqldump数据时,应该在mysqldump命令加上参数“–set-gtid-purged=OFF”。
canal工具报错权限不足
场景描述
在搭建canal环境,使用指定用户从GaussDB(for MySQL)获取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;