我有一个名为db.sql的文件;该文件包含一个数据库的数据.我想将此数据导入到新建立的主/副本 struct 中名为db的数据库中.

我使用mysql -u USER -p'PASS' db < db.sql命令将数据库导入主服务器.导入后,数据成功插入master服务器,但没有插入replica服务器.(尽管如此,工作中没有错误)

我判断了db.sql文件的内容,其中包括:

SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;

SET @@GLOBAL.GTID_PURGED='server-1:1-376,
server-2:1-2086154';

#end of the file
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

我知道原因是禁用binlog,但我有三个问题:

  1. 我有很多备份文件是通过这种方式导出的;如何将它们导入到我现在的master服务器中,然后它就会进入replica服务器.(我认为如果我删除这些行,它会解决我的问题,但有没有办法直接用MySQL来做呢?)
  2. 对于新导出的备份,如何以可以直接导入的方式防止此问题?下面的脚本生成db.sql文件.
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"

mysql ${MYSQL_CONN} -ANe"STOP SLAVE" 2> /dev/null

mysqldump ${MYSQL_CONN}  --single-transaction --quick ${DB_NAME}  2> /dev/null > ${OUTPUT_PATH}/db.sql

mysql ${MYSQL_CONN} -ANe"START SLAVE"  2> /dev/null
  1. 备份文件来自具有不同GLOBAL.GTID_PURGED的不同主/副本;这是否会导致任何问题?如果是,如何解决?

推荐答案

https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html表示:

如果未设置--set-gtid-purged选项,则默认为 转储输出中包含SET @@GLOBAL.gtid_purged语句 如果在要备份的服务器上启用了GTID,并且 gtid_executed系统变量的全局值中的GTID为 不是空的.还包括一条SET @@SESSION.sql_log_bin=0语句 如果在服务器上启用了GTID.

这与您在转储输出中看到的内容相匹配.

过了一会儿,同一页上写着:

--set-gtid-PURGED选项的可能值如下:

...

OFF

SET @@GLOBAL.gtid_purged不会添加到输出,并设置为 @@SESSION.sql_log_bin=0不会添加到输出中.对于服务器 在未使用GTID的情况下,使用此选项或AUTO.只能用这个 选项用于正在使用GTID的服务器,如果您确定 目标上的gtid_purged中已存在所需的GTID集 服务器,并且不应更改,或者如果您计划标识并添加 任何手动丢失的GTID.

我建议您在运行mysqldump时设置为--set-gtid-purged=OFF.

Mysql相关问答推荐

SQL条件 Select 和条件WHERE

MySQL多连接以获得单个结果集(使用MySQL max函数)

带有 JOIN 和 WHERE 子句的 INSERT 语句

模拟Mysql Cursor类的fetchone()方法,并将其返回值设置为None

需要按总金额检索前 3 个供应商,每个类别 - 子类别

为什么 MySQL 不使用索引进行简单的SELECT * FROM Table WHERE field='value'查询?

根据单个日期字段获取范围/天数

在 MySQL 中为多列创建索引以进行查询优化

sql sum - 处理连接表中的脏重复项

MySQLi count(*) 总是返回 1

减少mysql中的值但不是负数

如何使用 C++ 连接 mySQL 数据库

MySQL函数查找两个日期之间的工作日数

仅在 MYSQL DATEDIFF 中显示小时数

mysql 数据类型仅存储月份和年份

第 1 行的 CSV 输入中的列数无效错误

如何将具有相同列值的mysql行分组为一行?

与 MySql 的连接正在自动中止.如何正确配置Connector/J?

在 MySQL Workbench 中导出超过 1000 条记录的查询结果

mysql GROUP_CONCAT 重复