在这篇文章中,我们将学习如何在CentOS中备份和恢复SQL数据库。这篇文章是关于在CentOS上管理SQL Server这一主题的第二篇文章。在我之前的文章《在CentOS上安装SQL Server》中,我们学习了如何在CentOS上安装和创建SQL数据库。
- 使用SQL Server管理工作室在windows 10和CentOS Linux之间备份和恢复SQL数据库
- 使用SQL Server数据工具将windows 10上的SQL服务器实例的数据复制到CentOS上的SQL实例。
- 使用SQL Server导入和导出向导将windows 10上的SQL服务器实例的数据复制到CentOS上的SQL实例。
在这篇文章中,我们将学习备份和恢复方法,将SQL Server数据从Windows复制到CentOS。
我在工作站上创建了一个虚拟机并安装了CentOS 8.0。我已经下载并配置了Windows 10的SQL Server实例上的stackoverflow2010数据库。
我们正在使用 WinSCP 软件将备份文件从 Windows 复制到 Linux。这是一个免费的SFTP客户端,用于在本地和远程计算机之间复制数据。为了复制数据,它使用以下文件传输协议。
- 安全文件传输协议(SFTP)
- 文件传输协议(FTP)
- 安全复制协议(SCP)
- 亚马逊S3:它是一个云存储服务。你可以在Amazon S3和本地电脑之间复制
- 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
输出

运行下面的查询,查看表和数据的列表。
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
查询输出
让我们为 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/
命令输出
现在,让我们复制备份文件。启动WinSCP。首先,我们必须配置一个会话来在服务器之间复制文件。在登录屏幕上,你可以提供登录细节。输入适当的配置值以连接到CentOS的文件共享。输入以下配置参数的值。
- **文件协议。**指定适当的文件传输协议。在我们的例子中,我们使用SFTP协议,所以我们从下拉列表中选择SFTP。
- **主机名和端口:**指定你要连接的计算机的主机名/IP地址和端口。我们要连接到我的工作站,IP地址是192.168.1.2。所以,我指定了192.168.1.2,端口号是22。
- **用户名:**指定远程机器的用户名。我是用root用户连接的,所以我输入了root作为用户名。
- **密码:**指定适当的密码以连接到远程机器。我已经输入了root用户的密码。
点击 "登录"。以下是登录屏幕的截图。

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

一旦备份文件被复制,让我们检查备份文件是否被复制。另外,我们必须检查备份文件的权限。运行以下命令。
**[root@localhost /]#**ls -l /SQLServer/SQLBackup/
输出
正如你在上面的图片中所看到的,备份文件被复制了,而且权限也被正确应用。让我们在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
查询输出
正如你所看到的,文件组被创建。现在,运行下面的查询来查看表和数据的列表。
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
查询输出
正如你所看到的,表和数据被成功恢复了。
总结
这篇文章解释了如何将数据库的数据从Windows 10复制到CentOS。我解释了一种备份和恢复数据库的方法。假设你正计划将SQL Server的操作系统从Windows Server迁移到Linux。在这种情况下,这篇文章帮助你建立一个开发环境,这有助于建立一个开发环境。在下一篇文章中,我们将学习如何使用SQL Server导入-导出向导将SQL数据库从Windows 10复制到CentOS。





