1. 程式人生 > >docker中的sql server 導入數據庫文件mdf

docker中的sql server 導入數據庫文件mdf

bsp view 找到 tac class 主機 有一個 在那 通過

  在上一篇文章中我們已經成功在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/中已經有這兩個文件了了只需要在數據庫中輸入語句

EXEC sp_attach_db @dbname = ‘DemoHis‘, @filename1 = ‘/var/opt/mssql/DemoHis.mdf‘, @filename2 = ‘/var/opt/mssql/DemoHis_log.ldf‘ GO 就會提示運行成功,至此我們終於將mdf文件導入了docker中的sql server。 後記: 雖然寫的很多很雜,但是還是要寫,一方面自己沒有太多時間去寫的很好看,但是另外一方面這個問題在網上又沒有找到別的解決方法。網上的博客中都是泛泛而談,裝環境的博客千千萬,裝完環境之後能不能用倒是沒人關心了。hello world之後的第二步,也是需要開拓的。 mac 下使用sql server的坑實在多,為了導入一個mdf文件就要這樣費神,只能留下一篇這樣的流水記,勉勵探索的後人。

docker中的sql server 導入數據庫文件mdf