Windows10系統的Linux子系統中安裝MySQL數據庫心得


后端開發童鞋們, 自己開發機用的是Windows系統電腦(台式機或筆記本), 而開發的程序和使用的數據庫等要運行在Linux服務器上, 這種情況有木有? 提前聲明: 本文並不討論操作系統的比較, 以及用Windows電腦開發后端程序是否合適的問題. 如果你現在用的是macOS系統或者Linux系統電腦, 或者你開發的程序及使用的工具不需要在Linux系統上運行. 那么請略過本文, 以免浪費時間.

說明: 如果對細節不關注的童鞋, 請直接跳到最后看小結與展望

0x00 背景說明

我現在做的項目是用.NET Core+MySQL+Nginx技術棧, 而這個服務器端程序最終也要運行在Linux系統上.
最初, 使用VS2017+Windows版MySQL+IIS服務器在我的筆記本電腦(以下簡稱開發機)開發調試, 功能開發好以后, 發布程序到Linux系統上, 服務器要安裝.NET Core運行時, Linux版MySQL數據庫和Nginx Web服務器.
后來遇到兩個問題, 都是因Linux系統上的名稱(一個是文件名, 另一個是MySQL數據庫表名)區分大小寫, 而Windows系統不區分, 導致程序出Bug.
主要原因是自己對Linux系統不熟悉(我是個假的程序員嗎?), 但是換個角度想, 如果調試時的環境與真實服務器環境一致, 還是可以減少諸如此類的麻煩. 下面請看我所知道的解決方案, 如果有更好的歡迎補充!

0x01 幾種方案

  1. 方案一: 特點優雅, 換用MacBook Pro筆記本, 因為macOS也是類UNIX操作系統, 所以原生支持Linux命令及資源. 還有一個最大的好處是, 現在越來越多的軟件也支持這個平台, 比如我的公司要求使用Evernote來共享文檔, 老板和員工的溝通工具使用QQ和微信, 等等. 這些需求不是我們個人能決定的, 因此一個平台有這些軟件的客戶端是非常有必要的.
  2. 方案二: 特點真實, 普通PC安裝Linux系統, 什么發行版無所謂, 當然最好能跟生產服務器上的發行版一致. 可以說在這種情況下開發機調試的結果跟生產服務器運行的結果幾乎一致, 但是不方便的地方就是缺少必要軟件支持, 比如上面提到的, 有人可能會說了用Wine, 或者在Linux系統中安裝虛擬機, 或者用它們的Web版, 這些方法我都試過, 跟在macOS或Windows操作系統上使用客戶端, 完全是兩個感受, 真的你要是能接受各種折騰和不方便, 那我也沒話說. 舉個例子一年多以前我在瀏覽器中用Evernote的Web版, 居然不能添加表格和在表格中插入行!
  3. 方案三: 特點卡頓, 開發機上的操作系統無所謂, 然后安裝虛擬機, Windows專有的HyperV, 免費的Virtual Box, VM Ware, macOS系統上專有的一款虛擬機, 等等. 如果開發機很強悍, 比如16核處理器+64G內存+2TB固態硬盤等等, 那么這個方案的"卡頓"特點就消失得無影無蹤, 隨之帶來的就是方便, 想開幾個操作系統就開幾個, 覺得系統里有些亂, 重新裝一個就好, 但是我的開發機僅僅4核+8G內存, 而且散熱也一般, 還要保證物理真機上也要運行一些程序, 不知道你們的跟我的情況一樣不.
  4. 方案四: 特點新穎, 使用Docker技術, Docker技術其實在今天看來已經不是最新的技術了. 但是我仍然只是看了一些入門講解, 並沒有實踐經驗. 因此本方案我不做詳細評論, 只簡單提一句. 尤其生產服務器也在使用Docker技術, 那么就更方便了. 直接把發布的程序和相關資源打包到Docker容器中, 無論是在開發機, 還是生產服務器, 用的都是同一個Docker容器, 管它什么操作系統, 運行環境肯定完全一致.
  5. 方案五: 特點如一, 這個方案分為初級版和高級版. 初級版是用遠程桌面, 高級版是用TeamViewer等使用VPN專線技術的軟件. 好處不用說了, 你一直都在同一台電腦上工作, 其他地點的電腦只是用了外設及網絡. 遠程桌面我用過一段時間, 比起在當前電腦上使用的體驗來看, 還是有些許不如. 至於TeamViewer軟件我沒用過, 但是它的使用方式我了解過, 在某些條件下還是很實用的.
  6. 方案六: 這個方案特點就不說了, 因為是我這次要介紹的方案. 前提還是使用Windows操作系統, 使用的工具小名叫WSL, 大名叫Windows Subsystem on Linux之前是beta版, 在1709版Win10以后就是正式版, 提前強調一下, 這個系統還不完善, 仍然有bug, 跟直接用Linux發行版相比, 還是有些許不如. 不過現在這個版本已經比beta版要強很多, 已經能到可以使用的程度了, 而且這一版的Ubuntu是16.04呦. 這個系統的原理我就不介紹了, 從使用上來看, 跟在macOS上用Linux命令和各種資源工具類似. 所以以前選擇在Windows系統中安裝虛擬機方案的童鞋, 並且開發機性能不高的, 強烈建議你們要嘗試一下.

0x02 WSL的安裝使用

  • WSL的安裝
  1. 所有設置 -> 應用 -> 相關設置: 程序和功能(也可以直接控制面板 -> 程序 -> 程序和功能) -> 啟用或關閉Windows功能 -> 適用於Linux的Windows子系統, 勾選上它, 然后確定, 需要重啟電腦;
  2. Microsoft Store中搜索"Ubuntu", 會有2個搜索建議, 一個是"在Windows下運行Linux", 另一個就是"Ubuntu", 當然你也可以搜索"openSUSE", 或者其他的發行版名稱, 以后支持的發行版會越來越多, 然后選擇你需要的那個發行版, 點擊獲取安裝, 如果一個發行版都不安裝, 在命令行中輸入"bash", 會提示當前不存在Linux子系統(大概這個意思), 安裝之后可以直接在開始菜單中點擊Ubuntu這個UWP程序, 這是一個包裝過的命令行窗口, 並且直接啟動到Linux子系統中, 也可以先啟動cmd命令行窗口或者PowerShell窗口, 輸入bash命令, 也會啟動Linux子系統
  • WSL的使用
  1. 第一次進入Linux子系統會提示你創建一個用戶, 輸入用戶名和密碼, 再次確認密碼即可;
  2. 我安裝的是Ubuntu16.04版本, 目標是安裝MySQL數據庫服務器版並運行. 再次強調: 這不是虛擬機*3(重要的事情說三遍), 因此Windows系統使用的資源跟Linux子系統是一套, 所以要注意端口占用的問題. 比如我之前安裝過Windows版MySQL數據庫, 並監聽3306端口, 那么最好在Linux子系統中運行時, 先停掉Win系統中的MySQL數據庫服務. 我是直接把Win版MySQL數據庫刪了, 重新安裝了一個僅Client的程序, 然后服務器安裝在Linux子系統中;
  3. 我在Linux子系統中試了幾個我自己知道的工具和命令, 有Python3和Git, 文本編輯器有vim和nano, 還有ifconfigping這2個命令也可用, 查看當前系統信息的命令:lsb_release -a, 還有ssh好像也能用(不太會用, 以后學, 另外以后Windows系統可能原生支持openSSH, 上面的方案中也漏掉了這種用Windows操作系統電腦遠程SSH登錄服務器的方式);
  4. Linux子系統有一點要注意, 那就是Windows主系統中的文件能夠在Linux子系統中可見, 而Linux子系統中的文件在Windows主系統中不可見. 舉個栗子, 比如我在Windows主系統的C:\Demo\Project\src目錄中的源代碼文件, 可以對其使用dotnet publishgit pull / push(前提是安裝Win版的DotNet Core和Git), 然后我在Linux子系統中就可以在/mnt/c/Demo/Project/src這個路徑下找到這些文件, 並且也可以執行同樣的命令(前提是安裝Linux版的DotNet Core和Git). 也就是只要在相應的系統中安裝了對應的程序包, 就可以執行對應的操作或命令, 只不過需要你能訪問到命令執行的對象文件, 但是你在Linux子系統的/home/Demo/Project/src目錄下存放的源代碼文件, 在Windows主系統中訪問不到, 這就沒辦法了. 因此我一般都是把開發工作放在Windows系統中, 而把部署運行工作放在Linux子系統下.
  5. 這里多說一句, 這個Linux子系統不支持GUI圖形界面, 你可以把它當成Linux服務器版來用. 但是有Linux大神已經給出解決方案, 在Linux子系統中安裝GIMP程序, 然后在Windows10系統中安裝Xming軟件(注意這是Win版軟件), 我個人覺得沒必要, 有需要的童鞋請自行百度, 網上教程很多;

0x03 MySQL數據庫的安裝和刨坑

  1. 更新apt更新源: sudo apt-get update;
  2. 安裝MySQL服務器版: sudo apt-get install mysql-server, 我沒連VPN, 但是下載速度還行;
  3. 安裝完畢后, 需要輸入MySQL數據庫root用戶的密碼, 這個密碼一定要記着! 我的同事小伙伴, 安裝完Win版的MySQL數據庫以后, 當時輸入的root用戶密碼是啥就沒記, 然后一直連着公司服務器的測試數據庫. 結果有一天想把測試庫down到本機, 結果發現本機MySQL數據庫服務器進不去...;
  4. 從這里開始就是刨坑, 對面那個童鞋你別笑, 你也可能遇到這個坑, 對, 就說你呢! 第一個坑就是, 我興沖沖地輸入: mysql -u root -p, 沒有熟悉的MySQL命令交互界面, 取而代之的給我報了個錯, 如下: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2). MySQL的本地訪問是用socket的, 關鍵的問題是我的/var/run/目錄下根本沒有mysqld目錄, 這是什么鬼? 移除后重裝也不行, 網上有5個解決方案: 傳送門, 我也逐一地嘗試了, 用管理員身份運行PowerShell, 在其中運行bash, 然后運行mysql命令前加sudo, 這樣就排除的權限的問題, 但是還不行; 執行sudo service mysql status, 可以看到服務器狀態已停止, 執行sudo service mysql start命令啟動服務器, 啟動失敗; 什么連接數太大, 權限不足, 服務沒啟動等都不能解決; 甚至說mysql.cnf或my.cnf文件中指向的mysql.sock文件路徑不對, 需要更改, 就更不可能了. 首先我就沒找到mysql.sock這個文件, 我指哪個路徑呢? 其次我的mysql.cnf或my.cnf文件中內容也不對, 沒有更改socket文件指向的節點. 但是服務肯定是沒啟動起來, 后來也不知道到了哪個目錄下, 運行sudo service mysql start就成功了. 我在寫這篇文章時, 特意找了一下那個目錄, 沒找到也記不清楚了, 大家根據自己的實際情況刨坑吧(可以先試試在/etc/init.d/目錄下執行);
  5. 用Windows版MySQL客戶端程序也能連接這個MySQL數據庫服務器了, 但是運行程序又報錯, 說是連接數據庫失敗, 調試了一下發現程序中用的IP地址, 而我在客戶端程序里用的localhost, 客戶端里用ip也不能訪問, 在Linux子系統中首先執行ifconfig命令, 發現有本機ip地址, 再執行ping命令, 也能ping通, 最后執行sudo mysql -h [ip地址] -P 3306 -u root -p, 提示無法連接. 這個網上有很多人說, 其實本來不用寫出來, 大家自行百度或Google就行. 但是我發現一個坑, 就是網上的說法一般都是在原生Linux發行版系統下, 位置為/etc/my.cnf, /etc/mysql/my.cnf, /usr/local/etc/my.cnf或其他, 而我是在/etc/mysql/mysql.conf.d/目錄下找到了mysqld.cnf這個文件, 把其中的bind-address設置項注釋掉即可, 不知道為什么存放的文件不一樣;
  6. 最后試了一下, 表名真的區分大小寫了. 另外用戶如果想用ip訪問, 那么MySQL數據庫用戶的From Host要設置成%, 這個別忘記了. 還有一個尚未解決的問題, 就是至少要有一個bash窗口開啟, 如果所有的都關閉, Windows系統會認為你從Linux子系統中退出, 這樣也是訪問不到MySQL數據庫服務的, 網上有人說先做個vbs腳本, 啟動一個隱藏窗口的bash, 並且把這個腳本添加到開機啟動中執行, 另外Linux子系統第一次啟動時也需要一個sh腳本自動開啟MySQL數據庫服務, 但是我沒實踐, 這個大家請自便, 唯一注意的就是啟動MySQL數據庫服務后至少保留一個bash程序的窗口.

0x04 小結和展望

  1. 目的是Windows系統上運行MySQL客戶端, Windows系統中的Linux子系統運行MySQL服務器端;
  2. 在"啟用或關閉Windows功能"里勾選"適用於Linux的Windows子系統", 確定並重啟;
  3. 在Microsoft Store里下載並安裝Ubuntu或其他的Linux子系統的UWP程序, 並運行, 首先輸入用戶名及密碼;
  4. 在Linux子系統中安裝MySQL數據庫服務器端, 安裝成功后輸入root用戶的密碼, 並啟動數據庫服務;
  5. 我在安裝好MySQL后遇到兩個問題, 一個是執行mysql -u root -p時報錯, 這個要在特定的目錄下重新啟動服務; 另一個是無法用ip訪問, 這個是找到對應的配置文件, 把bing-address = 127.0.0.1設置行注釋掉即可;
  6. 以后計划在Linux子系統中安裝Nginx服務器, 然后把.NET Core程序部署到Nginx服務器上運行;
  7. 最后如果你對這方面有什么使用心得, 歡迎補充!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM