2021-04-11

M1 Mac SQL Server 环境配置

该文章写于 M1 芯片刚刚发布之时,部分内容距今已有较大变化,仅供参考。

这学期的数据库实验要用 SQL Server。但可惜 SQL Server 只能在 Windows 或者 x86_64 的 Linux 下才可以运行,所以又要折腾配置环境了!

TL; DR

1
2
docker pull mcr.microsoft.com/azure-sql-edge
docker run --cap-add SYS_PTRACE -e 'ACCEPT_EULA=1' -e 'MSSQL_SA_PASSWORD=yourStrong(!)Password' -p 1433:1433 --name SQLServer -d mcr.microsoft.com/azure-sql-edge

尝试 1: Windows 虚拟机

使用 Paralles Desktop M1 预览版安装 Windows 10 on ARM,之后在虚拟机内尝试安装 Windows 版的 SQL Server。结果多次尝试,安装中均出现错误,还卸不掉。尝试 1 失败。

尝试 2: Docker 镜像

Docker M1 Mac 版下载:https://docs.docker.com/docker-for-mac/apple-m1/

由于 M1 的 Docker 可以通过 QEMU 模拟 x86_64 的 Linux,因此去 Docker Hub 搜了一下 SQL Server。但是一看评论区,一堆人说不能在 M1 上跑这个,因此果断放弃。

image-20210411113116859

尝试 2 失败。

尝试 3: Azure SQL Edge

根据这篇教程,这里使用的是 Azure SQL Edge 镜像。因此按照它的步骤尝试了一下。拉取并运行:

1
2
docker pull mcr.microsoft.com/azure-sql-edge
docker run --cap-add SYS_PTRACE -e 'ACCEPT_EULA=1' -e 'MSSQL_SA_PASSWORD=yourStrong(!)Password' -p 1433:1433 --name SQLServer -d mcr.microsoft.com/azure-sql-edge

这里的 MSSQL_SA_PASSWORD 需要是强密码,否则容器无法成功运行

但是由于 Mac 上没有 SQL Server Management Studio,因此这里用Azure Data Studio替代,虽然没有出 M1 的原生版本,但是通过转译可以正常使用。

打开 Azure Data Studio,在新建连接的选项中,设置如下,其中密码为之前设置的强密码:

image-20210411113751214

成功连接后,就可以点击上方的 New Query 进行查询:

image-20210411114151649

导入 MDF 和 LDF 文件

由于这学期的数据库实验,还给了 MDF 和 LDF 这两个数据库文件,需要要将其导入到这个 SQL Server 容器里面。通过微软的这篇文档,发现可以通过 SQL 语句,以文件的形式导入。

因此,首先要通过docker cp将本地的文件复制到容器中。复制之前需要将权限改为其他人可读可写,否则由于docker cp复制时的文件所有者设置的原因,SQL Server 容器中的 mssql 用户无法读取这两个文件。

实验提供的是School_Data.MDFSchool_Log.LDF,以此为例:

1
2
3
chmod 666 School_*
docker cp School_Data.MDF SQLServer:/home/mssql/
docker cp School_Log.LDF SQLServer:/home/mssql/

之后回到 Azure Data Studio,在 New Query 中输入并执行:

1
2
3
4
CREATE DATABASE School
    ON (FILENAME = '/home/mssql/School_Data.mdf'),   
    (FILENAME = '/home/mssql/School_Log.ldf')   
    FOR ATTACH;  

image-20210411114826057

成功导入!

image-20210411114958907