【问题标题】:ACI sql server container drops databases after restartACI sql server 容器在重启后丢弃数据库
【发布时间】:2020-04-14 10:36:05
【问题描述】:

我在 Azure 实例容器 (ACI) 中运行带有文件存储持久性的 sql server 容器。

sql server 在文件存储中连接了一些数据库,并且在容器重新启动之前它运行良好。

重新启动后,所有数据库都从 sql 服务器中消失了,我必须再次手动附加所有数据库。

重启后是否可以再次自动附加所有数据库?

我试过这样的模板

"resources": [
    {
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2018-10-01",
        "name": "[parameters('containerGroups_mssql_2019_name')]",
        "location": "WestEurope",
        "properties": {
            "containers": [
                {
                    "name": "[parameters('containerGroups_mssql_2019_name')]",
                 "properties": {
                    "command": [
                       "/opt/mssql-tools/bin/sqlcmd",
                       "-l",
                       "60",
                       "-U",
                       "SA",
                       "-P",
                       "!thisWillMakeMyDayEveryDayIn2019",
                       "-i",
                       "/mnt/mydata/scripts/attach_all_databases.sql"
                    ],

它不起作用。

但如果我在容器内执行相同的命令,它会正常工作。

谁能指点一下?

提前谢谢你

迈凯尔

【问题讨论】:

  • 你还在解决这个问题吗?我没有看到任何更新。如果有什么我可以为你做的事吗?

标签: sql-server azure azure-container-service azure-container-instances


【解决方案1】:

您需要将数据库保存在一个卷中。这是一个有用的链接:

https://docs.microsoft.com/en-us/azure/container-instances/container-instances-volume-azure-files

【讨论】:

  • 您好 Thiago,谢谢您的回复,我已经在使用文件存储持久性,即使容器重启后,它仍然连接到所有数据库的文件存储,但数据库已从sql server 实例,我需要再次附加它们。
【解决方案2】:

对于您遇到的问题,您需要了解 Azure 容器实例的两个概念。

一个是当您停止和启动容器实例时,它将开始使用相同的容器配置进行新的部署。所以如果你自己不设置持久化存储,它不会持久化旧容器实例中的数据。您可以了解stop and start the container的详细信息。

还有一个是 Azure 容器实例不支持包含多个单词的命令。例如,它可以运行命令ls,但它不支持命令ls -al。查看有关Restriction 的更多详细信息。

因此解决方案是创建一个新图像以将命令放入图像中。并且要将数据持久化到容器实例中,需要mount the Azure File share to the container instance。请注意,如果将共享挂载到存在文件或目录的容器目录中,则这些文件或目录会被挂载遮盖,并且在容器运行时无法访问。所以挂载点应该是一个不包含有用文件的目录或者自己新建一个来持久化数据。

【讨论】:

  • 嗨 Chales,谢谢你的回复,我想我理解前两个概念。最后一部分将文件共享安装到容器中,现有目录和文件不可访问。我不明白,如果我在没有命令的情况下创建容器并输入 sql 服务器,我从文件存储中附加数据库没有问题。那么在容器创建/运行过程中,当前文件何时可以访问?
  • @MikaelBraadNielsen 如果文件已经在文件存储中,而不是容器中,则可以访问这些文件。该功能只是意味着挂载文件存储将覆盖目录中已有的文件。
  • 你好,查尔斯我已经尝试过这个“资源”:[{“properties”:{“containers”:[{“properties”:{“command”:[“/mnt/mydata/scripts/ attachdatabases.sh" ], sh 文件包含 /opt/mssql-tools/bin/sqlcmd -l 60 -U SA -P !thisWillMakeMyDayEveryDayIn2019 -i /mnt/mydata/scripts/attach_all_databases.sql 容器启动时失败它只是继续重试开始。日志中的错误信息为:standard_init_linux.go:178: exec user process caused "exec format error"
  • 我位于文件共享 /mnt/mydata 上的 sh 和 attach_all_databases.sql 文件执行 sh 文件没有任何问题,并且所有数据库都已附加。
  • @MikaelBraadNielsen 我不建议你设置命令,它会覆盖图像中的CMD命令,如果你在图像末尾启动应用程序,那么如果你设置应用程序将无法启动命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多