为非根容器配置持久存储权限
若要允许非根用户访问已装载卷上的数据库文件,请确保以可读取/写入永久性文件存储的用户身份或组成员身份运行容器。
可通过此命令获取数据库文件的当前所有权。
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 stop 和 docker 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 的备份或还原:
部署 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。还必须在容器内的 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 数据库与用户数据库分开。
连接到 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使用以下 T-SQL 脚本验证是否已修改
tempdb文件位置:SELECT * FROM sys.sysaltfiles WHERE dbid = 2;必须重启 SQL Server 容器,这些更改才能生效。
docker stop sql1 docker start sql1打开交互式 bash 会话以连接到容器。
docker exec -it sql1 bash ls /var/opt/mssql/tempdb/#如移动成功,则有以下输出 tempdb.mdf templog.ldf
参考链接:
Microsoft Learn
评论