Docker运行SQL SERVER下的数据持久化
标签搜索

Docker运行SQL SERVER下的数据持久化

Thomas
2024-02-27 / 0 评论 / 0 阅读 / 正在检测是否收录...

为非根容器配置持久存储权限

若要允许非根用户访问已装载卷上的数据库文件,请确保以可读取/写入永久性文件存储的用户身份或组成员身份运行容器。

可通过此命令获取数据库文件的当前所有权。

ls -ll <database file dir>

如果 SQL Server 无权访问持久数据库文件,请运行以下命令之一。

授予根组对数据库文件的读/写访问权限

授予对以下目录的根组权限,使非根 SQL Server 容器有权访问数据库文件。

chgrp -R 0 <database file dir>
chmod -R g=u <database file dir>

将非根用户设置为文件的所有者

这可以是默认的非根用户,也可以是要指定的任何其他非根用户。 在此示例中,我们将 UID 10001 设置为非根用户。

chown -R 10001:0 <database file dir>

保留数据

即使通过 docker stopdocker start 重启容器,SQL Server 配置仍会更改,且数据库文件依然保留在容器中。 但是,如果使用 docker rm 删除容器,则会删除容器中的所有内容,包括 SQL Server 和数据库。 以下部分介绍如何使用数据卷保留数据库文件(即使关联的容器已被删除)。

重要:
对于 SQL Server,了解 Docker 中的数据持久性至关重要。 除本部分讨论的内容外,请参阅有关如何在 Docker 容器中管理数据的 Docker 文档

备注
SQL Server 2019 (15.x) 及更高版本容器以非根用户的身份自动启动,而 SQL Server 2017 (14.x) 容器在默认情况下以根用户的身份启动。 有关以非根用户的身份运行 SQL Server 容器的详细信息,请参阅配置安全性。

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1433:1433 -v <host directory>/data:/var/opt/mssql/data -v <host directory>/log:/var/opt/mssql/log -v <host directory>/secrets:/var/opt/mssql/secrets -d mcr.microsoft.com/mssql/server:2019-latest

借助此方法,还能共享和查看 Docker 外部的主机上的文件。

备份和还原

除这些容器技术外,还可使用 SQL Server 标准备份和还原技术。 可通过备份文件来保护数据,或将数据移至其他 SQL Server 实例。 有关详细信息,请参阅在 Linux 上备份和还原 SQL Server 数据库

警告
如果要创建备份,请确保在容器外部创建或复制备份文件。 否则,一旦删除容器,备份文件也将随之删除。

启用容器中的 VDI 备份和还原

从 CU15 for SQL Server 2019 和 CU28 for SQL Server 2017 开始,SQL Server 容器部署现在支持虚拟设备接口 (VDI) 备份和还原操作。 按照以下步骤为 SQL Server 容器启用基于 VDI 的备份或还原:

  1. 部署 SQL Server 容器时,请使用 --shm-size 选项。 若要开始,请将大小设置为 1 GB,如以下示例命令所示:

    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Mystr0ngP@ssw0rd!" --shm-size 1g  -p 1433:1433 --name sql19 --hostname sql19 -d mcr.microsoft.com/mssql/server:2019-latest

    使用选项 --shm-size,可以在容器内配置共享内存目录 (/dev/shm) 的大小,默认情况下设置为 64 MB。 共享内存的这一默认大小不足,无法支持 VDI 备份。 建议你在部署 SQL Server 容器并想要支持 VDI 备份时将此大小配置为至少 1 GB。

  2. 还必须在容器内的 mssql.conf 中启用新参数 memory.enablecontainersharedmemory。 可以使用保留数据部分中所述的 -v 选项,或在通过手动更新容器内的 mssql 来部署容器后,在部署容器时装载 mssql.conf。 下面是一个示例 mssql.conf 文件,其中 memory.enablecontainersharedmemory 设置设为 true。

    [memory]
    enablecontainersharedmemory = true

配置时区

若要在具有特定时区的 Linux 容器中运行 SQL Server,请配置 TZ 环境变量(有关详细信息,请参阅在 Linux 上配置时区)。 若要查找正确的时区值,请从 Linux bash 提示符运行 tzselect 命令:

tzselect

选择时区后,tzselect 显示类似以下内容的输出:

The following information has been given:

        United States
        Pacific

Therefore TZ='America/Los_Angeles' will be used.

要查看容器内的时区,请在容器内运行以下命令查询。

date +%Z

要查看容器内的时间,请在容器内运行以下命令查询。

date

可使用此信息在 Linux 容器中设置相同的环境变量。 以下示例介绍如何在 Americas/Los_Angeles 时区的容器中运行 SQL Server:

sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
   -p 1433:1433 --name sql1 \
   -e 'TZ=America/Los_Angeles'\
   -d mcr.microsoft.com/mssql/server:2019-latest

更改默认文件位置

添加 MSSQL_DATA_DIR 变量以在 docker run 命令中更改数据目录,然后将卷装载到容器的用户有权访问的位置。

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=MyStrongPassword' -e 'MSSQL_DATA_DIR=/my/file/path' -v /my/host/path:/my/file/path -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest

更改 tempdb 路径

最好将 tempdb 数据库与用户数据库分开。

  1. 连接到 SQL Server 实例,然后运行以下 Transact-SQL (T-SQL) 脚本。 如果存在多个与 tempdb 相关的文件,也需要移动这些文件。

    ALTER DATABASE tempdb MODIFY FILE (
    NAME = tempdev, FILENAME = '/var/opt/mssql/tempdb/tempdb.mdf'
    );
    GO
    
    ALTER DATABASE tempdb MODIFY FILE (
     NAME = templog, FILENAME = '/var/opt/mssql/tempdb/templog.ldf'
    );
    GO
  2. 使用以下 T-SQL 脚本验证是否已修改 tempdb 文件位置:

    SELECT *
    FROM sys.sysaltfiles
    WHERE dbid = 2;
  3. 必须重启 SQL Server 容器,这些更改才能生效。

    docker stop sql1
    docker start sql1
  4. 打开交互式 bash 会话以连接到容器。

    docker exec -it sql1 bash
    ls /var/opt/mssql/tempdb/
    #如移动成功,则有以下输出
    tempdb.mdf templog.ldf

参考链接:
Microsoft Learn

0

评论

博主关闭了所有页面的评论