ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2270|回复: 6

两个服务器之间的内容复制

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-4-19 09:07 | 显示全部楼层 |阅读模式

现在两个数据库分别在两台机上(A,B)

要求:   从A机上的SQL2000的一个名为原数的数据库,完全复制(备份)到B机的同名数据库中

思路:

1\用SQL本身的存储过程,完全备份过来,这个思路但不会做,请高手指点

2\VBA中的on time   可以定时地进行,初步的思路是先将原来数据库的资料删除,再将要备份的资料全部 转进,但数据量大时就可能就不太实际了吧?

以上两点请高手给意见并指点(尤其第一点)

TA的精华主题

TA的得分主题

发表于 2007-4-19 11:17 | 显示全部楼层
2.这个对付一下MDB还可以,SQL SERVER是不行的,mdf文件在使用中不能被COPY的.
有关于1,运行存储过程进行备份,这种文章在网上可以搜到很多,需要你去再修改测试的.

TA的精华主题

TA的得分主题

发表于 2007-4-19 22:05 | 显示全部楼层
SQL服务器上应该有管理工具可以导入数据的。你可以搜搜DTS数据转换服务看看。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-4-23 10:20 | 显示全部楼层

在存储过程实搞不明,只好用自己知道的方法来处理了

就好象以前听别人说的在用win的年代里还用DOS的感觉,但我只会这个!

在本系统中测试,最多的一张表是9W行,34列,其余有多有少,20张表要1500S

我也知道太长了,也要送出来让大家评点评点,全部代码如下:
前提是先要手动做一次要备份的数据库,并设好字段,ID什么的,之后才能用本程式(同时没有创立表的功能,与第一次相比,源数据库新建的表不备份,要的话,要重新手动一次)

Sub 测试数据库复制()
   
    Dim Cat As New ADOX.Catalog
    Dim i%, j&, k%, aaa!
    Dim TabName$
    Dim Pths$, Pths3$
    Dim Rs2 As New ADODB.Recordset
    aaa = Timer
      '需要引用:微软   ADO   Ext.2.6   for   dll   之后   Dim cat As New ADOX.Catalog这个定义才不会提示错误

On Error GoTo 9
    Pths = "  Provider=SQLOLEDB.1;server=生产五号机;uid=sa;pwd=;database=原数"
    Pths3 = "  Provider=SQLOLEDB.1;server=生产三号机;uid=sa;pwd=;database=原数"
  
'取出两个数据库的表名
    Cat.ActiveConnection = Pths '建立连接
    ReDim arr5(1 To Cat.Tables.Count)
    For i = 1 To Cat.Tables.Count: arr5(i) = Cat.Tables(i - 1).Name: Next
    Set Cat.ActiveConnection = Nothing
   
    Cat.ActiveConnection = Pths3
    ReDim arr3(1 To Cat.Tables.Count)
    For i = 1 To Cat.Tables.Count: arr3(i) = Cat.Tables(i - 1).Name: Next
    Set Cat.ActiveConnection = Nothing
   
 '取出两表中相同的,但不是系统表的表名
 
    For i = 1 To UBound(arr3)
        TabName = arr3(i)
        If InStr(TabName, "sys") + InStr(TabName, "dtp") > 0 Then   '除去系统表--变为空
            TabName = ""
        Else
            Dim A
            A = Application.Match(TabName, arr5, 0)
            If IsError(A) Then TabName = ""                         '找不到 '将arr3与arr5比较 存在的留下,不在的也变为空
        End If
        arr3(i) = TabName
    Next
 
If CNN.State = 0 Then CNN.Open Pths     '源数据库
If CNN2.State = 0 Then CNN2.Open Pths3  '要备份的数据库
   
On Error GoTo 99
CNN2.BeginTrans
    For i = 1 To UBound(arr3) '两个数据库之间存在相同的用户表
    TabName = arr3(i)
    If Len(TabName) > 0 Then
        strsql = "delete " & TabName
        Set rs = Nothing
        rs.Open strsql, CNN2, 1, 2, 1
       
        '在源资料中取出全部的资料
        strsql = "select * from " & TabName
        Set rs = Nothing
        rs.Open strsql, CNN, 1, 1, 1
       
        'update 备份
        strsql = "select * from " & TabName
        Set Rs2 = Nothing
        Rs2.Open strsql, CNN2, 1, 2, 1
        For j = 1 To rs.RecordCount     '源数据库
            Rs2.AddNew                      '在新数据库中update
            For k = 0 To rs.Fields.Count - 1: Rs2(rs.Fields(k).Name) = rs.Fields(k): Next
            Rs2.Update
            rs.MoveNext
        Next
        Debug.Print TabName, Format(Timer - aaa)
    End If
    Next
CNN2.CommitTrans
Call NewMsgbox(Format(Timer - aaa) & "S  备份全部完成!")
'MsgBox Format(Timer - aaa) & " S  备份全部完成!"

    Set rs = Nothing
    Set Rs2 = Nothing
    Set Cat.ActiveConnection = Nothing
    CNN2.Close: Set CNN2 = Nothing
    Exit Sub
9:
    MsgBox Err.Description
    Set rs = Nothing
    Set Rs2 = Nothing
    Set Cat.ActiveConnection = Nothing
    CNN2.Close: Set CNN2 = Nothing
    Exit Sub
99:
    CNN2.RollbackTrans: MsgBox Err.Description
    Set rs = Nothing
    Set Rs2 = Nothing
    Set Cat.ActiveConnection = Nothing
    CNN2.Close: Set CNN2 = Nothing
End Sub

[此贴子已经被作者于2007-4-23 14:18:58编辑过]

TA的精华主题

TA的得分主题

发表于 2007-4-23 12:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

本来想用ActiveConnection 来实现

但实了半天也没成功,回家在试吧

有消息了通知你

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-4-27 15:57 | 显示全部楼层

4楼的概念是可能的,但实施起来就耗时太长不实际,

不太会SQL2000内部的存储过程,但经试了多天,一个多结合的异机备份过程可以如下实现:

1\在AB两机分别安装两个SQL2000

2\以A机为主服务器,B机为备用

3\在A机中设立(手工)备份计划,将备份放到一个指定的文件夹(如E:\原数备份),指定的时间为几个时间点!

4\利用A机VBA的ontime在前面的几个时间点后,将最新的备份,转到B机中的指定文件夹(如E:\原数备份)

5\将A机的相关数据库结构写成脚本,并在B机用查询分析器建成一个空的数据库(如此可保证两个数据库的结构完全相同)

6\在新的数据库是将上述已移到B机的A机数据库备份,用手工的还原形式(指定设备),即可还原(200M的数据库只用几十秒即可!与4楼中的1400S不可同日而语!)

7\本来SQL2000中还有一个调度作业,可以定时做指定的工作的,但因这种还原的使用是不定时的,若果自动无条件地还原,可能就是一直保持着主服务器的最后状态,显然也是不可取的!所以这一步未确定如何做!

8\基本上这种异机备份已能达到相关的要求!只中加点手工操作而已

9\请各位高手指点

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-4-28 16:21 | 显示全部楼层

突然产生一个想法:

就是在楼上的方法中,先在备用服务器中写一个恢复的存储过程

在将备份调到备用机时,可否用VBA调用SQL2000中的该过程,不就一切问题解决了吗?

请高手出手指点下这个思路实现的可能性呀

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 07:38 , Processed in 0.031246 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表