AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 222108
Accepted
db2
db2
Asked: 2018-11-09 08:08:55 +0800 CST2018-11-09 08:08:55 +0800 CST 2018-11-09 08:08:55 +0800 CST

通过指向一个或多个包含备份文件的目录并指定 STOPAT 时间来恢复数据库 [重复]

  • 772
这个问题在这里已经有了答案:
从网络共享自动化数据库还原 (1 个答案)
3 年前关闭。

我正在准备/测试我们的 ERP 和其他辅助系统到新数据库服务器的迁移。这将涉及将数据库备份从旧服务器恢复到新服务器上。

为了方便起见,我希望能够使用脚本/存储过程来恢复数据库,只需指向一个或多个包含备份文件(完整、差异和日志的组合)的目录,并可选择指定一个 STOPAT 时间,或者忽略它并在存在备份的情况下恢复到最近的可能时间。我还需要能够明确指定新文件位置(MOVE 选项),或者更一般地“将所有数据文件放在这里,并将所有日志文件放在这里”。该工具应查看所提供目录中的所有文件,并确定需要恢复哪些文件才能达到目标时间。

Management Studio 中的 GUI 恢复工具可以完成所有这些,但显然不能包含在脚本中。我希望能够编写一个在概念上与此类似的通用迁移脚本:

EXEC master..RestoreDB
    @database='ERPSysDB',
    @source='\\oldserver\Backup\oldserver\ERPSysDB\FULL,\\oldserver\Backup\oldserver\ERPSysDB\DIFF,\\oldserver\Backup\oldserver\ERPSysDB\LOG',
    @datadir='D:\SQLServer\DATA',
    @logdir='L:\SQLServer\DATA';

--Do various cleanup/post processing steps in ERPSysDB here

EXEC master..RestoreDB
    @database='ERPCompanyDB',
    @source='\\oldserver\Backup\oldserver\ERPCompanyDB\FULL,\\oldserver\Backup\oldserver\ERPCompanyDB\DIFF,\\oldserver\Backup\oldserver\ERPCompanyDB\LOG',
    @datadir='D:\SQLServer\DATA',
    @logdir='L:\SQLServer\DATA';

--More post-processing in ERPCompanyDB here

--Now restore a test copy of the database that we don't back up directly on the production server,
--using production database backups instead:
EXEC master..RestoreDB
    @database='ERPCompanyDB',
    @restoreas='ERPCompanyTestDB',
    @source='\\oldserver\Backup\oldserver\ERPCompanyDB\FULL,\\oldserver\Backup\oldserver\ERPCompanyDB\DIFF,\\oldserver\Backup\oldserver\ERPCompanyDB\LOG',
    @stopat='2018-11-01T08:00:00'
    @with='MOVE ''ERPDataFile'' TO ''D:\SQLServer\DATA\ERPCompanyTestDB.mdf'', MOVE ''ERPLogFile'' TO ''L:\SQLServer\DATA\ERPCompanyTestDB.ldf''';

--Additional post-processing, database restores, etc...

是否有提供此功能的现有工具?我准备自己编写,但那将是相当复杂的代码块(尤其是错误/异常处理),所以我不想重新发明轮子。我更希望它可以在 T-SQL 中使用,即不是 PowerShell cmdlet,但是 CLR 存储过程会很好(并且很可能是实现它的更简单/更好的方法)。

sql-server backup
  • 2 2 个回答
  • 127 Views

2 个回答

  • Voted
  1. Best Answer
    db2
    2018-11-13T06:44:09+08:002018-11-13T06:44:09+08:00

    这是我上周放在一起的东西,而不是在这个利基市场中找到任何其他东西。

    https://github.com/dave-britten/RestoreDB

    用法相当简单(尽管有许多选项可以自定义)。例如,我的测试服务器重新加载脚本可以执行类似这样的操作来恢复 Dynamics GP 系统数据库:

    EXEC master.dbo.RestoreDB @Source='+\\oldserver\Backup\oldserver\DYNAMICS', @Database='DYNAMICS', @AutoMove=1, @Replace=1
    

    这会将数据库 DYNAMICS 恢复到最新的可用时间点,并自动将所有数据库文件移动到实例默认数据和日志目录。

    另外两个有用的选项是@RestoreAs和@AutoRename,它们结合使用时,可以轻松地以不同的名称(例如测试副本)恢复数据库,并自动重命名数据库文件(将旧数据库名称替换为新的数据库名称)。

    目前,RestoreDB 至少需要 SQL Server 2016,但我想让它与 2012 及更高版本一起使用。

    • 1
  2. Kin Shah
    2018-11-13T07:33:38+08:002018-11-13T07:33:38+08:00

    如果你想使用 tsql 然后使用 - sp_RestoreGene。它是一个了不起的 SP,它将完全满足您的需求。

    此过程查询 master 中的 msdb 数据库备份历史和数据库文件详细信息。它构建并返回 RESTORE DATABASE 命令作为其结果集,它不执行命令。

    注意:我同意 Andy 的观点,您应该探索dbatools,因为它具有一些高级恢复功能。

    • 1

相关问题

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve