在上一篇文章中我們已經成功在docker中跑起來了一個sql server。
現在問題來了,我有一個mdf文件,我應該如何導入到sql server?
在window平台似乎有對應的工具,但是docker中卻不一樣。原因是docker相當於創建了一個虛擬的linux環境,在這個環境中運行sql server。作為mac玩家,我們沒有類似於window這樣的工具。即使有,由於sql server運行在虛擬的環境中,而我們的文件在本地主機中,所以兩個是互相隔離的。
簡單來說,如果你想要導入mdf文件,你應該看到有人告訴你這樣做:
EXEC sp_attach_db @dbname = '你的數據庫名',
@filename1 = 'mdf文件路徑(包綴名)',
@filename2 = 'Ldf文件路徑(包綴名)'
但是當你在你的sql server中輸入上面的語句,他會告訴你路徑不存在。為什么?因為sql server運行在docker提供的虛擬linux上,在那個linux上顯然沒有你這個文件。
解決方法:
我在https://docs.microsoft.com/zh-cn/sql/linux/sql-server-linux-configure-docker?view=sql-server-2017中找到了解決方案。
簡單來說,docker就是一個容器,而我們的數據庫文件mdf現在在容器外,我們需要將這個文件放入容器內,才能進行導入。
sql server提供了一種方法叫做:將主機目錄加載為數據卷,簡單來說就是把我們主機上的一個目錄映射到容器內的一個目錄上。
然而微軟之后又叫了一條提醒,暫時不支持將mac的主機目錄加載進去,它提示我們改為使用數據卷。
指令如下:
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1433:1433 -v sqlvolume:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2017-latest
注意看:這個指令其實是在創建一個sql server 然后這個sql server多了-v sqlvolume:/var/opt/mssql 這一部分, 用於為這個sql server創建一個volume名為sqlvolume,並且這個容器的位置在docker虛擬的linux的/var/opt/mssql中。 如果我們還想為這個數據庫命名 我們需要在-p 1433:1433 后面加上一句 --name yourname (如果直接加在最后面會報錯)
好了現在我們已經創建了一個帶有數據卷的sql server。我們可以使用 docker volume ls 查看是否創建成功,應該會顯示一個volume。
類似
DRIVER VOLUME NAME
local demovolume
demovolume是我給我的volume取得名字。
ok 現在我們只需要將mdf文件拷貝到容器中再導入即可,指令如下:
docker cp <Host path> <Container ID>:<Container path>
container id可以通過 docker ps查看到。
像我這樣:
docker cp /yourpath.../DemoHis_log.ldf b2e95c59a4fb:/var/opt/mssql/DemoHis_log.ldf
docker cp /yourpath.../DemoHis.mdf b2e95c59a4fb:/var/opt/mssql/DemoHis.mdf
現在我們在var/opt/mssql/中已經有這兩個文件了了只需要在數據庫中輸入語句