SQL Server On Linux(25)——SQL on Linux 备份和还原(2)——还原

本人新书上市,请多多关照:《SQL Server On Linux运维实战 2017版从入门到精通》

在这里插入图片描述

接上文 SQL Server On Linux(24)——SQL on Linux 备份和还原(1)——备份, 本文演示“备份”的配套工作——还原。

  还原操作在两个平台上都类似,可以使用SQL命令或者SSMS图形界面操作,比较常见的差异在于你需要还原的数据库来自于别的地方(如别的服务器或者专用备份设备),然后在还原过程中需要对文件夹授权(包括读取备份文件和还原数据库时数据库文件写入对应磁盘的权限)。
  这种情况什么时候会发生呢?在作者的经历中,出现在环境迁移的时候,比如有一个系统以前运行在Windows上,需要还原到Linux上,一般的操作是:

  1. 在Windows上备份数据库,通过某些方式如SCP传到Linux上,这是第一次授权,需要确保备份文件能够写到Linux上。可能这个文件夹还不是备份需要存放的地方。只是临时移动所用,所以你可能需要再次调整权限在Linux上把备份文件移动到指定的备份文件夹。这是第二次权限调整。
  2. 如果你的数据库打算直接还原到SQL Server现在的文件目录,那权限基本上不用调整,但是如果你需要把库还原到别的文件夹,就会引入第3次的权限调整。

  下面我们来还原一下前面备份的数据库,只是把库名改成“AdventureWorks2017_Test”:

RESTORE DATABASE [AdventureWorks2017_Test] FILE = N'AdventureWorks2017' 
FROM  DISK = N'/var/sqlbackup/AdventureWorks2017.bak' WITH  FILE = 1,  
MOVE N'AdventureWorks2017' TO N'/var/opt/mssql/data/AdventureWorks2017_Test.mdf',  
MOVE N'AdventureWorks2017_log' TO N'/var/opt/mssql/data/AdventureWorks2017_Test_0.ldf',  NOUNLOAD,  STATS = 10
GO

  除了直接的还原,还有一种“还原”数据库的操作——附加数据库。从效果来说,通常附加的速度快,但是分离附加(配套操作)在常规运维当中不应该纳入数据库“备份还原”范畴,作者更愿意相信它只是一个应急操作。毕竟暴力分离操作很多时候会导致日志异常。
  下面我们先把刚还原的“AdventureWorks2017_Test”分离,然后移动到另外一个文件夹再附加。因为SSMS操作没什么特别的需要演示的,所以作者尽量使用命令行的方式,同时为了让读者更加习惯使用Linux的命令行环境。

  1. 分离数据库
    分离之前我们先要检查一下数据库的文件所在路径,以免分离后找不到文件:
SELECT name,physical_name 
FROM sys.master_files
WHERE database_id=db_id('AdventureWorks2017_Test')

  由于Linux界面输出结果没有格式化(需要安装第三方工具,但是作者不想引入过多这些工具),所以这里可以使用SSMS来查询,本环境结果如下图,注意图中的name是逻辑文件名,physical_name是物理文件名,这两个跟数据库名并不总是一致的。
在这里插入图片描述

  然后回到Linux界面,使用SQLCMD执行T-SQL命令来分离数据库:

EXEC master.dbo.sp_detach_db @dbname = N'AdventureWorks2017_Test'
  1. 移动文件到另外一个目录
      这里创建一个新目录,新目录为/var/opt/mssql/testdata/,并用命令授权。下面3个命令用于创建和授权:
~$ sudo mkdir /var/opt/mssql/testdata/
~$ sudo chown mssql /var/opt/mssql/testdata
~$ sudo chgrp mssql /var/opt/mssql/testdata

  然后使用cp来复制文件然后用rm删除旧文件夹的文件,其实可以用mv(等于Windows的剪切),但是剪切过程如果出现如断网、关机之类的情况,会导致无法恢复,相对危险,所以建议使用cp。
  在实际copy之前,我们要切换到mssql这个账号,由于这个账号并没有提供密码(安装过程没有提供),在不得不修改mssql这个账号的密码之前,我们还有其他办法,就是先切换root(~$ sudo su – root ),再切换mssql(~# su – mssql ),注意前面的$已经变成了#,同时“-”前后都有空格。
  然后就可以开始copy操作:

cp -rv /var/opt/mssql/data/AdventureWorks2017_Test* /var/opt/mssql/testdata/

  cp、-rv、和*号之间均有空格,*代表模糊匹配,把所有AdventureWorks2017_Test开头的文件复制到对应目录。-rv用于显示进度,虽然并没有实际的进度条。在复制完毕之后,可以用exit退出mssql这个账号的作用域,回到root作用域,然后~# su – superdbadmin 回到我们正常的账号作用域中。
  文件复制完毕之后,可以进行附加操作:

USE [master]
GO
CREATE DATABASE [AdventureWorks2017_Test] ON 
( FILENAME = N'/var/opt/mssql/testdata/AdventureWorks2017_Test.mdf' ),
( FILENAME = N'/var/opt/mssql/testdata/AdventureWorks2017_Test_0.ldf' )
 FOR ATTACH
GO

  结果如下图:
在这里插入图片描述

  数据库的备份还原基础演示就到这里,对于初学者来说,基本上够用了,当然命令行确实比较累,真正工作过程不妨使用SSMS来操作大部分的过程。不过还是建议读者多联系Linux上的操作。
  另外要提醒一下,备份是为了还原,不能还原的备份是没有意义的,但是除了真正还原一个数据库并且对数据库做详细的检查之外,没有任何一种方式能够100%确保备份的有效性。同时数据库的数量之大、容量之大,往往上班8小时都不够用于校验全部数据库的备份,但是作为DBA,又不能不做,所以作者日常工作会周期性或不定期抽检。大概方式如下,任何一步失败或者异常都应该当作本次“备份失败”,流程图如下:
在这里插入图片描述

  这不是官方的流程,只是个人工作总结,仅供参考,下面针对内容挑一些来解释一下:

  • 备份文件体积差异且无法解释
      有时候体积差异是可以解释的,比如大批量历史数据归档,那么现有数据库的体积可能会比前一个备份文件小很多。
  • 如果服务器的空间不足以再次还原一个库
      那么就用RESTORE VERIFY来校验。当然其他服务器空间充足的话可以在别的服务器实施。
  • 数据库能否打开
      有时候还原过程无误,但是发现数据库变成只读或者根本没法打开,要检查一下权限的问题,也有可能备份文件有损坏。
  • 还原过程失败
      本人最常见的就是还原的数据库无法写入指定的文件夹,说白了就是权限问题。
发布了192 篇原创文章 · 获赞 1268 · 访问量 250万+

猜你喜欢

转载自blog.csdn.net/DBA_Huangzj/article/details/104718069