
如果从库上表 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_namet');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。
如果是大表,这里可以用可传输表空间方式备份、恢复表,减少锁表时间。
“将一个数据库中的一个表复制到另一个数据库中的表中”的过程如下。
具体步骤:
首先,打开并连接Sql Server,在源数据库Source_db(源数据库名称)上右键,然后依次点击“编写表脚本为”→“CREATE到”→“新查询编辑器窗口”。
在第1步产生的编辑器中按”crtl+a“组合键全选内容,然后右键“复制“(或按"crtl+c"键)。
新建查询,然后右键”粘贴“(或ctrl+v);如图所示,将代码中Source_db(源数据库名)改为target_db(目标数据库名)。接着右键单击”执行“执行代码。
在目标数据库的表结构中就可以看到被复制过来的表了。
当你使用一种直接备份方法时,你必须保证表不在被使用。如果服务器在你则正在拷贝一个表时改变它,拷贝就失去意义。保证你的拷贝完整性的最好方法是关闭服务器,拷贝文件,然后重启服务器。如果你不想关闭服务器,要在执行表检查的同时锁定服务器。如果服务器在运行,相同的制约也适用于拷贝文件,而且你应该使用相同的锁定协议让服务器“安静下来”。假设服务器关闭或你已经锁定了你想拷贝的表,下列显示如何将整个samp_db数据库备份到一个备份目录(DATADIR表示服务器的数据目录):%cd DATADIR%cp -r samp_db /usr/archive/mysql单个表可以如下备份:%cd DATADIR/samp_db%cp member /usr/archive/mysql/samp_db%cp score /usr/archive/mysql/samp_db 当你完成了备份时,你可以重启服务器(如果关闭了它)或释放加在表上的锁定(如果你让服务器运行)。要用直接拷贝文件把一个数据库从一台机器拷贝到另一台机器上,只是将文件拷贝到另一台服务器主机的适当数据目录下即可。要确保文件是MyIASM格式或两台机器有相同的硬件结构,否则你的数据库在另一台主机上有奇怪的内容。你也应该保证在另一台机器上的服务器在你正在安装数据库表时不访问它们。 重点是这个:要确保文件是MyIASM格式或两台机器有相同的硬件结构
两种方法:
1、在“SQL
Server
配置管理器”中将你的SQL
SERVER服务停止,然后将你安装数据库文件中的data文件夹下的
你的数据库名mdf和你的数据库名ldf文件夹拷给别人,最后拿到该文件的人,直接在mssql2005的“SQL
Server
Management
Studio”工具中,用附加数据库的方式添加即可。
2、在你电脑上的“SQL
Server
Management
Studio”工具中找到你要用来传的数据库名,在上面点右键--任务--备份数据库。为其指定一个目录后,点保存。之后会生成一个文件,你直接将该文件
拷贝给你要给的人。拿到这个备份文件的人,首先要在他电脑的“SQL
Server
Management
Studio”工具中新建一个空数据库,且该数据库名要和你电脑上的那个名称一致,最后在这个数据库名上点右键--任务--还原--数据库,选中刚才的那
个备份文件,点确定也可以还原。
可用如下方法复制:
如果新表不存在:
比如有一张表叫test,现在要复制表结构及表内数据,可执行代码:
create table test as select from test;
这样就把表结构连同数据一起复制了。
如果表存在,可用以下代码:
insert into test1 select from test;commit;
12--------------新表 ↓ 要复制的源表↓Select Into newTable From sourceTable
这个语句会将sourceTable结构包括数据全部复制一份放到新表中newTable 是新表的名字,在执行前newTable 表不能已存在,如果只复制结构不要数据
12Select top 1 Into newTable From sourceTable --少要点只要一行truncate table newTable --清除掉数据
关于
select
into
语句:
SQL
SELECT
INTO
语句可用于创建表的备份复件。
SELECT
INTO
语句
SELECT
INTO
语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT
INTO
语句常用于创建表的备份复件或者用于对记录进行存档。
SQL
SELECT
INTO
语法
您可以把所有的列插入新表:
SELECT
INTO
new_table_name
[IN
externaldatabase]
FROM
old_tablename
或者只把希望的列插入新表:
SELECT
column_name(s)
INTO
new_table_name
[IN
externaldatabase]
FROM
old_tablename
SQL
SELECT
INTO
实例
-
制作备份复件
下面的例子会制作
"Persons"
表的备份复件:
SELECT
INTO
Persons_backup
FROM
Persons
IN
子句可用于向另一个数据库中拷贝表:
SELECT
INTO
Persons
IN
'Backupmdb'
FROM
Persons
如果我们希望拷贝某些域,可以在
SELECT
语句后列出这些域:
SELECT
LastName,FirstName
INTO
Persons_backup
FROM
Persons
SQL
SELECT
INTO
实例
-
带有
WHERE
子句
我们也可以添加
WHERE
子句。
下面的例子通过从
"Persons"
表中提取居住在
"Beijing"
的人的信息,创建了一个带有两个列的名为
"Persons_backup"
的表:
SELECT
LastName,Firstname
INTO
Persons_backup
FROM
Persons
WHERE
City='Beijing'
SQL
SELECT
INTO
实例
-
被连接的表
从一个以上的表中选取数据也是可以做到的。
下面的例子会创建一个名为
"Persons_Order_Backup"
的新表,其中包含了从
Persons
和
Orders
两个表中取得的信息:
SELECT
PersonsLastName,OrdersOrderNo
INTO
Persons_Order_Backup
FROM
Persons
INNER
JOIN
Orders
ON
PersonsId_P=OrdersId_P
以上就是关于mysql数据库可以直接复制吗全部的内容,包括:mysql数据库可以直接复制吗、如何将一个数据库中的一个表复制到另一个数据库中的表中、怎么拷贝数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)