在CentOS中管理SQL数据库:备份和恢复SQL数据库

255 阅读5分钟

在这篇文章中,我们将学习如何在CentOS中备份和恢复SQL数据库。这篇文章是关于在CentOS上管理SQL Server这一主题的第二篇文章。在我之前的文章《在CentOS上安装SQL Server》中,我们学习了如何在CentOS上安装和创建SQL数据库。

  1. 使用SQL Server管理工作室在windows 10和CentOS Linux之间备份和恢复SQL数据库
  2. 使用SQL Server数据工具将windows 10上的SQL服务器实例的数据复制到CentOS上的SQL实例。
  3. 使用SQL Server导入和导出向导将windows 10上的SQL服务器实例的数据复制到CentOS上的SQL实例。

在这篇文章中,我们将学习备份和恢复方法,将SQL Server数据从Windows复制到CentOS。

我在工作站上创建了一个虚拟机并安装了CentOS 8.0。我已经下载并配置了Windows 10的SQL Server实例上的stackoverflow2010数据库。

我们正在使用 WinSCP 软件将备份文件从 Windows 复制到 Linux。这是一个免费的SFTP客户端,用于在本地和远程计算机之间复制数据。为了复制数据,它使用以下文件传输协议。

  1. 安全文件传输协议(SFTP)
  2. 文件传输协议(FTP)
  3. 安全复制协议(SCP)
  4. 亚马逊S3:它是一个云存储服务。你可以在Amazon S3和本地电脑之间复制
  5. WebDAV:网络分发授权和版本管理。它是HTTP协议的一个扩展,用于远程文件编辑和修改。

你可以从这里下载WinSCP。安装很简单,而且是交互式的。

审查数据库模式

在从源头和目的地复制SQL数据库之前,最好先审查数据库文件、模式结构和数据。运行以下一组查询。

运行以下查询以查看文件和文件组的列表

 USE stackoverflow2010 
  go 
  SELECT fg.NAME           AS [File Group Name], 
         sdf.NAME          AS [Logical File Name], 
         sdf.physical_name AS [File Location], 
         size / 128        AS [File size] 
  FROM   sys.database_files sdf 
         INNER JOIN sys.filegroups fg 
                 ON sdf.data_space_id = fg.data_space_id 
 

输出

Filegroup

运行下面的查询,查看表和数据的列表。

 
SELECT
  t.Name        AS TableName,
  sch.Name      AS SchemaName,
  part.Rows     AS RowCounts
FROM
  sys.tables t
  INNER JOIN sys.indexes indx ON t.object_id = indx.object_id
  INNER JOIN sys.partitions part ON indx.object_id = part.object_id AND indx.index_id = part.index_id
  INNER JOIN sys.allocation_units a ON part.partition_id = a.container_id
  LEFT OUTER JOIN sys.schemas sch ON t.schema_id = sch.schema_id
WHERE
  t.Name NOT LIKE 'dt%'
  AND t.is_ms_shipped = 0
  AND indx.object_id > 255
GROUP BY
  t.Name, sch.Name, part.Rows
ORDER BY
  t.Name;
GO

查询输出

list of tables and rows

让我们为 stackoverflow2010 数据库生成一个纯拷贝的备份。该备份生成在 D:\SQLBackups\StackOverflow文件夹中。

 BACKUP DATABASE [StackOverflow2010] TO DISK = 
  'D:\SQLBackups\StackOverflow\StackOverflow2010.bak' WITH copy_only, stats=5 

一旦备份生成,让我们把它复制到CentOS。我已经在Linux的根目录下创建了一个名为SQLServer的目录。该目录的路径是**/SQLServer**。我在**/SQLServer**目录下创建了另一个名为SQLBackup的目录。我们正在复制/SQLServer/SQLBackup目录中的备份。通过运行以下命令创建目录。

**[root@localhost /]#**mkdir /SQLServer

**[root@localhost /]#**mkdir /SQLServer/SQLBackup

该目录对名为root的用户有读、写和执行的权限。要查看权限,你可以运行 ls -l命令。

**[root@localhost /]#**ls -l /SQLServer/

命令输出

View permission on directory

现在,让我们复制备份文件。启动WinSCP。首先,我们必须配置一个会话来在服务器之间复制文件。在登录屏幕上,你可以提供登录细节。输入适当的配置值以连接到CentOS的文件共享。输入以下配置参数的值。

  1. **文件协议。**指定适当的文件传输协议。在我们的例子中,我们使用SFTP协议,所以我们从下拉列表中选择SFTP。
  2. **主机名和端口:**指定你要连接的计算机的主机名/IP地址和端口。我们要连接到我的工作站,IP地址是192.168.1.2。所以,我指定了192.168.1.2,端口号是22。
  3. **用户名:**指定远程机器的用户名。我是用root用户连接的,所以我输入了root作为用户名。
  4. **密码:**指定适当的密码以连接到远程机器。我已经输入了root用户的密码。

点击 "登录"。以下是登录屏幕的截图。

Login to WinSCP

我们可以在D:\SQLBackup\Stackoverflow文件夹和**/SQLServer/SQLBackup**目录之间拖放备份文件。请看下面的图示。

Use WinSCP to manage sql database

上传过程开始了。

Backup file is copying

一旦备份文件被复制,让我们检查备份文件是否被复制。另外,我们必须检查备份文件的权限。运行以下命令。

**[root@localhost /]#**ls -l /SQLServer/SQLBackup/

输出

View permission on backup file

正如你在上面的图片中所看到的,备份文件被复制了,而且权限也被正确应用。让我们在CentOS上恢复SQL Server中的数据库。要做到这一点,请运行以下恢复命令。

 USE [master]
  RESTORE DATABASE [StackOverflow2010] FROM  
  DISK = N'/SQLServer/SQLBackup/StackOverflow2010.bak' WITH  FILE = 1,  
  MOVE N'StackOverflow2010' TO N'/var/opt/mssql/data/StackOverflow2010.mdf',  
  MOVE N'fg_posts_data' TO N'/var/opt/mssql/data/fg_posts_data.ndf',  
  MOVE N'Stackoverflow2010_Posts' TO N'/var/opt/mssql/data/Stackoverflow2010_Posts.ndf',  
  MOVE N'StackOverflow2010_log' TO N'/var/opt/mssql/data/StackOverflow2010_log.ldf', 
  MOVE N'DF_MemoryOptimized_Posts' TO N'/var/opt/mssql/data/FG_MemoryOptimized_Posts', 
  NOUNLOAD,  STATS = 5
  GO

一旦SQL数据库被恢复,让我们运行一些查询来验证数据库是否被成功恢复。

运行下面的查询来查看文件和文件组的列表

USE stackoverflow2010 
  go 
  SELECT fg.NAME           AS [File Group Name], 
         sdf.NAME          AS [Logical File Name], 
         sdf.physical_name AS [File Location], 
         size / 128        AS [File size] 
  FROM   sys.database_files sdf 
         INNER JOIN sys.filegroups fg 
                 ON sdf.data_space_id = fg.data_space_id
 

查询输出

Filegroup in Linux

正如你所看到的,文件组被创建。现在,运行下面的查询来查看表和数据的列表。

SELECT
  t.Name        AS TableName,
  sch.Name      AS SchemaName,
  part.Rows     AS RowCounts
FROM
  sys.tables t
  INNER JOIN sys.indexes indx ON t.object_id = indx.object_id
  INNER JOIN sys.partitions part ON indx.object_id = part.object_id AND indx.index_id = part.index_id
  INNER JOIN sys.allocation_units a ON part.partition_id = a.container_id
  LEFT OUTER JOIN sys.schemas sch ON t.schema_id = sch.schema_id
WHERE
  t.Name NOT LIKE 'dt%'
  AND t.is_ms_shipped = 0
  AND indx.object_id > 255
GROUP BY
  t.Name, sch.Name, part.Rows
ORDER BY
  t.Name;
GO

查询输出

Tables and rows in Linux

正如你所看到的,表和数据被成功恢复了。

总结

这篇文章解释了如何将数据库的数据从Windows 10复制到CentOS。我解释了一种备份和恢复数据库的方法。假设你正计划将SQL Server的操作系统从Windows Server迁移到Linux。在这种情况下,这篇文章帮助你建立一个开发环境,这有助于建立一个开发环境。在下一篇文章中,我们将学习如何使用SQL Server导入-导出向导将SQL数据库从Windows 10复制到CentOS。