mySQL不能读数据_MySQL数据库复制后为何无法读取表中数据?

在主库上备份表 t (假设备份快照 GTID 为 aaaa:1-10000);

恢复到从库;

启动复制。

这里的问题是复制起始位点是 aaaa:101,从库上表 t 的数据状态是领先其他表的。aaaa:101-10000 这些事务中只要有修改表 t 数据的事务,就会导致复制报错 ,比如主键冲突、记录不存在(而 aaaa:101 这个之前复制报错的事务必定是修改表 t 的事务)

解决办法:启动复制时跳过 aaaa:101-10000 这些事务中修改表 t 的事务。

正确的修复步骤:

1. 在主库上备份表 t (假设备份快照 GTID 为 aaaa:1-10000),恢复到从库;

2. 设置复制过滤,过滤表 t:

CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE = ('db_name.t');

3. 启动复制,回放到 aaaa:10000 时停止复制(此时从库上所有表的数据都在同一状态,是一致的);

START SLAVE UNTIL SQL_AFTER_GTIDS = 'aaaa:10000';

4. 删除复制过滤,正常启动复制。

注意事项:这里要用 mysqldump --single-transaction --master-data=2,记录备份快照对应的 GTID

场景 2

如果复制报错后,使用跳过错误、复制过滤等办法修复了主从复制。主、从库数据一直在更新。

修复步骤:

在主库上备份表 t (假设备份快照 GTID为 aaaa:1-10000);

停止从库复制,GTID为 aaaa:1-20000;

恢复表 t 到从库;

启动复制。

这里的问题是复制起始位点是 aaaa:20001,aaaa:10000-20000 这些事务将不会在从库上回放,如果这里面有修改表 t 数据的事务,从库上将丢失这部分数据。

解决办法:从备份开始到启动复制,锁定表 t,保证 aaaa:10000-20000 中没有修改表 t 的事务。

正确修复步骤:

对表 t 加读锁;

在主库上备份表 t;

停止从库复制,恢复表 t;

启动复制;

解锁表 t。

如果是大表,这里可以用可传输表空间方式备份、恢复表,减少锁表时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java中的JDBC API来连接MySQL数据库并查询数据,然后使用Java IO流将数据写入到TXT文件中。具体步骤如下: 1. 导入MySQL JDBC驱动程序 在开始编写Java程序之前,需要先下载并导入MySQL JDBC驱动程序。可以从MySQL官方网站下载最新版本的JDBC驱动程序,并将其添加到Java项目的类路径中。 2. 连接MySQL数据库 使用JDBC API中提供的DriverManager类和Connection接口来连接MySQL数据库。需要提供MySQL数据库的URL、用户名和密码等信息。代码示例如下: ``` String url = "jdbc:mysql://localhost:3306/mydatabase"; String user = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, user, password); ``` 3. 查询数据 连接成功后,可以使用Java的Statement或PreparedStatement对象来执行SQL查询语句,获取MySQL数据库中的数据。代码示例如下: ``` Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM mytable"); while (rs.next()) { // 处理查询结果 } ``` 4. 写入TXT文件 使用Java IO流中的FileWriter和BufferedWriter类将查询结果写入到TXT文件中。代码示例如下: ``` File file = new File("data.txt"); FileWriter fw = new FileWriter(file); BufferedWriter bw = new BufferedWriter(fw); while (rs.next()) { String data = rs.getString("data"); bw.write(data); bw.newLine(); } bw.close(); fw.close(); ``` 完整的Java代码示例: ``` import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class MySQLToTXT { public static void main(String[] args) throws Exception { String url = "jdbc:mysql://localhost:3306/mydatabase"; String user = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM mytable"); File file = new File("data.txt"); FileWriter fw = new FileWriter(file); BufferedWriter bw = new BufferedWriter(fw); while (rs.next()) { String data = rs.getString("data"); bw.write(data); bw.newLine(); } bw.close(); fw.close(); rs.close(); stmt.close(); conn.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值