重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
如果从库上表 t 数据与主库不一致,导致复制错误,整个库的数据量很大,重做从库很慢,如何单独恢复这张表的数据?通常认为是不能修复单表数据的,因为涉及到各表状态不一致的问题。下面就列举备份单表恢复到从库会面临的问题以及解决办法:
创新互联建站服务项目包括自流井网站建设、自流井网站制作、自流井网页制作以及自流井网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,自流井网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到自流井省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
场景 1
如果复制报错后,没有使用跳过错误、复制过滤等方法修复主从复制。主库数据一直在更新,从库数据停滞在报错状态(假设 GTID 为 aaaa:1-100)。
修复步骤:
在主库上备份表 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。
如果是大表,这里可以用可传输表空间方式备份、恢复表,减少锁表时间。
你建表复制就可以了,例如CREATE TABLE aa AS SELECT * FROM tree;这是完全复制tree表的数据及表结构到aa表中。假如要复制某些字段的话,如:insert into 表名user(表中字段sal) select sal from emp;插入某一列sal到user表中,从emp表中获取sal的数据信息。最后提醒下,Oracle和MySql复制表建表 一样,可以自己建表结构,再复制数据;也可以复制部分列和部分数据,分开操作。 但要保证数据类型一致,插入指定列数,列数要相同,列的长度空间大就可以了。
可用update语句来更改,但要注意,两列的属性及长度应尽量保持一致,或被更改的列的长度大于另一列的长度,否则在update过程中容易报错。
1、创建测试表,插入数据:
create table test
(id int,
name varchar(10),
name1 varchar(10))
insert into test values (1,'a','s')
insert into test values (2,'b','w')
insert into test values (3,'c','x')
数据如下:
2、现在要将name1的内容更改为name中的内容,可用如下语句:
update test set name1=name;
3、更改后的结果如图(此时name和name1列的内容就相同了):
mysql里如何最快速度从一张表里取3列的值复制到另一张表里,有1亿条数据
一、复制表里面的一条记录并插入表里面
① insert into article(title,keywords,desc,contents) select title,keywords,desc,contents from article where article_id = 100;
二、复制表里的多条数据/记录,并插入到表里面
① INSERT INTO `power_node`(title,type,status) SELECT title,type,status FROM power_node WHERE id 5;
② INSERT into jiaban (num,overtime) SELECT num,overtime from jiaban where id IN(1,3,5,6,7,9);
三、在创建表时,就插入另一张表里面的某些数据
① create table user AS select * from member where id 10