[转载]不同服务器数据库之间的数据操作--复制同步(整理版)

备份还原:

A服务器为主服务器,客户端更新都更新在A服务器上;
B服务器为次服务器,B定时与A保持一致,结果B机时A的一个拷贝/备份,只是时间上有一个差。
实现方法:A定时备份;B定时以A的备份进行还原
具体方法如下:(MS-SQL中)
打开A服务器企业管理器,找到管理-SQL Server代理-作业,创建一个新作业,名字可以起备份,作业中创建一个步骤:
SQL code
BACKUP DATABASE [TEST] TO  DISK = ‘F:/SQL_SERVER/TEST/DB.BACKUP/TEST_BACKUP.BAK‘  WITH  INIT

以上TEST是数据库名称
然后在该作业里创建一个调度:具体周期时间的根据实际需求确定,比如每隔15分钟...
保存并运行作业。把F:/SQL_SERVER设为共享。
打开B服务器企业管理器找到管理-SQL Server代理-作业,创建一个新作业,名字可以起备份,作业中创建一个步骤:
SQL code
exec master..xp_cmdshell  ‘net use  //SERVER-A_IP/SQL_SERVER/TEST/DB.BACKUP  password  /user:username‘

以上目的就是同A取得联系,为后续还原做准备
然后再添加第二个步骤:
SQL code
restore database [TEST] from disk=‘//SERVER-A_IP/SQL_SERVER/TEST/DB.BACKUP/TEST_BACKUP.BAK‘

注意两个服务器都要有相同的数据库存放路径,我这里是备份放在F:/SQL_SERVER/TEST/DB.BACKUP,数据库放在F:/SQL_SERVER/TEST
调度和A一样就行了。
保存并运行作业。
看看是不是实现了B同步于A?
我就是用这种方法建立了3个服务器,自从这样做以来就没出现过因服务器down而造成的客户端不可用。

-----------------------------------------
-创建链接服务器
exec sp_addlinkedserver   ‘ITSV ‘, ‘ ‘, ‘SQLOLEDB ‘, ‘远程服务器名或ip地址 ‘
exec sp_addlinkedsrvlogin  ‘ITSV ‘, ‘false ‘,null, ‘用户名 ‘, ‘密码 ‘ 

--查询示例
select * from ITSV.数据库名.dbo.表名 

--导入示例
select * into 表 from ITSV.数据库名.dbo.表名 

--以后不再使用时删除链接服务器
exec sp_dropserver  ‘ITSV ‘, ‘droplogins ‘ 

--连接远程/局域网数据(openrowset/openquery/opendatasource)
--1、openrowset 

--查询示例
select * from openrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名) 

--生成本地表
select * into 表 from openrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名) 

--把本地表导入远程表
insert openrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名)
select *from 本地表 

--更新本地表
update b
set b.列A=a.列A
 from openrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1 

--openquery用法需要创建一个连接 

--首先创建一个连接创建链接服务器
exec sp_addlinkedserver   ‘ITSV ‘, ‘ ‘, ‘SQLOLEDB ‘, ‘远程服务器名或ip地址 ‘
--查询
select *
FROM openquery(ITSV,  ‘SELECT *  FROM 数据库.dbo.表名 ‘)
--把本地表导入远程表
insert openquery(ITSV,  ‘SELECT *  FROM 数据库.dbo.表名 ‘)
select * from 本地表
--更新本地表
update b
set b.列B=a.列B
FROM openquery(ITSV,  ‘SELECT * FROM 数据库.dbo.表名 ‘) as a
inner join 本地表 b on a.列A=b.列A 

--3、opendatasource/openrowset
SELECT   *
FROM   opendatasource( ‘SQLOLEDB ‘,  ‘Data Source=ip/ServerName;User ID=登陆名;Password=密码 ‘ ).test.dbo.roy_ta
--把本地表导入远程表
insert opendatasource( ‘SQLOLEDB ‘,  ‘Data Source=ip/ServerName;User ID=登陆名;Password=密码 ‘).数据库.dbo.表名
select * from

------------------------
--参考:
/*
作者:邹建
*/ 

/*--同步两个数据库的示例 

有数据
srv1.库名..author有字段:id,name,phone,
srv2.库名..author有字段:id,name,telphone,adress 

要求:
srv1.库名..author增加记录则srv1.库名..author记录增加
srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新
--*/ 

--大致的处理步骤
--1.在   srv1   上创建连接服务器,以便在   srv1   中操作   srv2,实现同步
exec   sp_addlinkedserver     ‘srv2‘,‘‘,‘SQLOLEDB‘,‘srv2的sql实例名或ip‘
exec   sp_addlinkedsrvlogin   ‘srv2‘,‘false‘,null,‘用户名‘,‘密码‘
go 

--2.在   srv1   和   srv2   这两台电脑中,启动   msdtc(分布式事务处理服务),并且设置为自动启动
我的电脑--控制面板--管理工具--服务--右键   Distributed   Transaction   Coordinator--属性--启动--并将启动类型设置为自动启动
go 

--然后创建一个作业定时调用上面的同步处理存储过程就行了 

企业管理器
--管理
--SQL   Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL   脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句:   exec   p_process
--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排 

然后将SQL   Agent服务启动,并设置为自动启动,否则你的作业不会被执行
设置方法:
我的电脑--控制面板--管理工具--服务--右键   SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定. 

--3.实现同步处理的方法2,定时同步 

--在srv1中创建如下的同步处理存储过程
create   proc   p_process
as
--更新修改过的数据
update   b   set   name=i.name,telphone=i.telphone
from   srv2.库名.dbo.author   b,author   i
where   b.id=i.id   and
(b.name <> i.name   or   b.telphone <> i.telphone) 

--插入新增的数据
insert   srv2.库名.dbo.author(id,name,telphone)
select   id,name,telphone   from   author   i
where   not   exists(
select   *   from   srv2.库名.dbo.author   where   id=i.id) 

--删除已经删除的数据(如果需要的话)
delete   b
from   srv2.库名.dbo.author   b
where   not   exists(
select   *   from   author   where   id=b.id)
go 

------------------------------------------------------------------------------

SQL SERVER 2005 同步复制技术
以下实现复制步骤(以快照复制为例) 

运行平台SQL SERVER 2005 

一、准备工作: 

1.建立一个 WINDOWS 用户,设置为管理员权限,并设置密码,作为发布快照文件的有效访问用户。 

2.在SQL SERVER下实现发布服务器和订阅服务器的通信正常(即可以互访)。打开1433端口,在防火墙中设特例 

3.在发布服务器上建立一个共享目录,作为发布快照文件的存放目录。例如:在D盘根目录下建文件夹名为SqlCopy 

4.设置SQL 代理(发布服务器和订阅服务器均设置)本篇文章发表于www.xker.com(小新技术网) 

打开服务(控制面板---管理工具---服务) 

---右击SQLSERVER AGENT---属性---登录---选择“此帐户“ 

---输入或选择第一步中创建的WINDOWS 用户 

---“密码“中输入该用户密码 

5.设置SQL SERVER 身份验证,解决连接时的权限问题(发布、订阅服务器均设置) 

步骤为:对象资源管理器----右击SQL实例-----属性----安全性----服务器身份验证------选“SQL Server和WINDOWS“,然后点确定 

6.开启SQL Server 2005的网络协议TCP/IP和管道命名协议并重启网络服务。 

7.在SQL Server中创建步骤1中对应的系统用户登陆名,作为发布数据库的拥有者(设置为dbo_owner和public)。 

8.以系统超级用户sa登陆SQL Server建立数据库和表。 

9.发布服务器和订阅服务器互相注册 

步骤如下:视图----单击以注册服务器----右键数据库引擎----新建服务器注册-----填写要注册的远程服务器名称------身份验证选“SQL Server验证“-----用户名(sa) 密码------创建组(也可不建)-----完成。 

10.对于只能用IP,不能用计算机名的,为其注册服务器别名 

二、开始: 

发布服务器配置(在发布服务器上配置发布和订阅) 

1. 选择 复制 节点 

2. 右键本地发布 ----下一步---------系统弹出对话框看提示----直到“指定快照文件夹“ 

----在“快照文件夹“中输入准备工作中创建的目录(指向步骤3所建的共享文件夹)------选择发布数据库-------选择发布类型-------选择订阅服务器类型-------选择要发布的对象------设置快照代理-------填写发布名称。本篇文章发表于www.xker.com(小新技术网) 

3. 右键本地订阅--------选择发布服务器-------选择订阅方式(如果是在服务器方订阅的话选择推送订阅反之 

选择请求订阅)-------填加订阅服务器--------选择代理计划(一般选择连续运行)---------其余选择默认项。 

至此, SQL SERVER 2005 同步复制就完成了。使用复制技术,用户可以将一份客户端的数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性,就无需编程实现客户端和服务器端数据同步了!大大提高了工作效率! 

------------------------------------

通过触发器实现数据库的即时同步
---即时同步两个表的实例:
--测试环境:SQL2000,远程主机名:xz,用户名:sa,密码:无,数据库名:test

--创建测试表,不能用标识列做主键,因为不能进行正常更新
--在本机上创建测试表,远程主机上也要做同样的建表操作,只是不写触发器
if exists (select * from dbo.sysobjects where id = object_id(N‘[test]‘) and OBJECTPROPERTY(id, N‘IsUserTable‘) = 1)
drop table [test]

create table test(id int not null constraint PK_test primary key
 ,name varchar(10))
go

--创建同步的触发器
create trigger t_test on test
for insert,update,delete
as
set  XACT_ABORT on
--启动远程服务器的MSDTC服务
exec master..xp_cmdshell ‘isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ‘‘net start msdtc‘‘,no_output"‘,no_output

--启动本机的MSDTC服务
exec master..xp_cmdshell ‘net start msdtc‘,no_output

--进行分布事务处理,如果表用标识列做主键,用下面的方法
BEGIN DISTRIBUTED TRANSACTION
delete from openrowset(‘sqloledb‘,‘xz‘;‘sa‘;‘‘,test.dbo.test)
 where id in(select id from deleted)
insert into openrowset(‘sqloledb‘,‘xz‘;‘sa‘;‘‘,test.dbo.test)
 select * from inserted
commit tran
go

--插入数据测试
insert into test
select 1,‘aa‘
union all select 2,‘bb‘
union all select 3,‘c‘
union all select 4,‘dd‘
union all select 5,‘ab‘
union all select 6,‘bc‘
union all select 7,‘ddd‘

--删除数据测试
delete from test where id in(1,4,6)

--更新数据测试
update test set name=name+‘_123‘ where id in(3,5)

--显示测试的结果
select * from test a full join
openrowset(‘sqloledb‘,‘xz‘;‘sa‘;‘‘,test.dbo.test) b on a.id=b.id
-----------------------------------

A.数据库镜像的方法
B.定时DTS 或者 SSIS 增量传输的方法

C.传送日志实现

D.Windows服务实现

  

时间: 2024-10-31 01:18:24

[转载]不同服务器数据库之间的数据操作--复制同步(整理版)的相关文章

SQL不同服务器数据库之间的数据操作整理(完整版)

---------------------------------------------------------------------------------- -- Author : htl258(Tony) -- Date : 2010-06-25 22:23:18 -- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) -- Jul 9 2008 14:43:34 -- Copyright (c) 1

SQLServer服务器数据库之间的数据操作(完整版)

分类: 数据库开发技术 ---------------------------------------------------------------------------------- -- Author : htl258(Tony) -- Date : 2010-06-25 22:23:18 -- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) -- Jul 9 2008 14:43:34 -- Cop

SQL不同服务器数据库之间的数据操作整理(完整版)(转)

---------------------------------------------------------------------------------- -- Author : htl258(Tony) -- Date   : 2010-06-25 22:23:18 -- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) --          Jul  9 2008 14:43:34 --    

不同服务器数据库之间的数据操作

--创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' --查询示例 select * from ITSV.数据库名.dbo.表名 --导入示例 select * into 表 from ITSV.数据库名.dbo.表名 --以后不再使用时删除链接服务器 exec sp_dr

阿里云RDS实例内不同数据库之间的数据迁移

适用场景 本文适用于使用DTS实现相同实例下库名不同的数据库之间的数据迁移.本文以使用DTS将同一RDS实例下的amptest库迁移到jiangliu_amptest库为例来说明如何使用DTS实现相同实例下库名不同的数据库之间的数据迁移. 说明:当源和目标实例类型不为RDS时,配置流程相同. 环境准备 创建RDS账号,不同的数据库类型,要求的迁移账号权限不同,具体权限要求可以参考产品手册-数据迁移中的相关文档. 在同一RDS实例下创建好amptest数据库以及jiangliu_amptest数据

Java使用jdbc连接Sqlite数据库进行各种数据操作的详细过程

前言:      SQLite是遵守ACID 的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.       不像常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分.所以主要的通信协议是在编程语言内的直接API调用.这在消耗总量.延迟时间和整体简单性上有积极的作用.整个数据库(定义.表.索引和数据本身)都在宿主主机上存储在一个单一的文件中.它的简单的设计是通过在开始一个事务的时候锁定整个数

数据库 MySQL 之 数据操作

一.MySQL数据类型介绍 MySQL支持多种类型,大致可以分为四类:数值.字符串类型.日期/时间和其他类型. ①二进制类型 bit[(M)] 二进制位(101001),m表示二进制位的长度(1-64),默认m=1 ②整数类型:存储年龄,等级,id,各种号码等 tinyint[(m)] [unsigned] [zerofill] 小整数,数据类型用于保存一些范围的整数数值范围: 有符号:-128 - 127. 无符号:255 特别的: MySQL中无布尔值,使用tinyint(1)构造. int

C#实现两个数据库之间的数据上报

用VS2008实现本地数据库上传数据到远程数据,数据可以是一个表,或一个表的部分数据,或查询数据,或数据编辑后上传. 其它VS版本,复制其中代码就可以,未使用其它任何插件,有详细注释. 单独页面实现,已经上传过的数据不能再上传,防治冲突. 文中的"表 _Sent"为需要上传时的数据备份表或修改后数据的表格,同时用以判断源数据是否上传. 源代码下载 版权声明:本文为博主原创文章,未经博主允许不得转载.

两个服务器不同的数据库之间的数据导入。

手贱,一不小心delete掉了数据库中的整张表.-.-!!!!当时那个惆怅啊. 最后终于找到了这个方法: 1.先进入你删除掉表的数据库, 写如下语句: sp_addlinkedserver 'xx.xx.xx.xx' --要导入的数据库的ip地址: exec sp_addlinkedsrvlogin  'xx.xx.xx.xx', 'false ',null, '用户名', '密码' INSERT INTO 表名 (字段1,字段2,字段3) SELECT 字段1,字段2,字段3 FROM [xx