在linux下安裝mariadb會出現一系列問題
問題1->服務器端不需要用戶名密碼就可登陸數據庫
問題2->php使用mysql不能連接數據庫 訪問受限
問題3->navicate遠程連接數據庫失敗
在搗鼓一段時間之后然后莫名就可以了,雖然知道是權限方面的問題,但是終究不得要領。為了弄清楚特意找了個新服務器,重新搭建一套ubuntu、php7、mariadb的環境重現一下問題。
具體的安裝過程這里略過了啊,網上這方面資料很多。
安裝完mariadb第一次登陸是沒有登錄密碼限制的,就是隨便輸什么密碼都可以進入,但是用戶名是固定的 root
#mysql -u root -p
空格
注意我這里輸入的是空格 然后就進來了.
之后我們看看這是為什么
MariaDB [mysql]> use mysql; MariaDB [mysql]> select user,password,host from user;
這個名為mysql的庫是記錄mysql相關內容的數據
而user就是記錄mysql用戶名及密碼權限的表可以看到root的密碼是空的
下面我們先解決這個問題
先運行命令
MariaDB [mysql]> grant all privileges on *.* to root@"localhost" identified by "123456";
然后我們查看用戶及密碼
MariaDB [mysql]> select user,password,host from user;
然后我們就會發現必須使用123456這個密碼來進圖數據庫了 問題一解決
下一步我們嘗試使用遠程工具navicate鏈接mariadb
然后通過度娘找到了一些方法
mysql和mariadb中關於root權限管理不同 需要調配
執行兩條命令 添加兩個用戶
MariaDB [mysql]> grant all privileges on *.* to root@"%" identified by "123456"; MariaDB [mysql]> grant all privileges on *.* to root@"127.0.0.1" identified by "123456"; MariaDB [mysql]> flush privileges;
退出數據庫 exit;或者ctrl+c
修改mysql的配置文件
# vim /etc/mysql/mariadb.conf.d/50-server.cnf
找到
bind-address = 127.0.0.1
將其注釋掉
# bind-address = 127.0.0.1
保存退出 重啟mysql
# service mysql restart
再次連接之后我驚喜的發現 還是鏈接不上,一股煩躁之氣漸漸升起。平定一下心神,看看數據庫去吧。
MariaDB [mysql]> select * from user;
之后找到這一行 為什么是N呢 這個權限不對啊 改下試試
MariaDB [mysql]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; MariaDB [mysql]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY '123456' WITH GRANT OPTION; MariaDB [mysql]> flush privileges;
重新連接發現
蒼天啊 大地啊 絕望啊 ,放棄吧? 開玩笑!
繼續查資料發現是端口問題使用
# netstat -aptn執行看看,是否監聽在0.0.0.0:3306
重啟mysql之后發現監聽並沒有改變
kill掉3306的進程號 991 再次重啟之后我得到了下面幾張截圖效果
本以為弄到這種程度就可以了 然而現實繼續教育了我 navicate遠程連接繼續失敗!!!
其實這時候我對於權限這塊還是端口這塊我是抱有疑問的 所以我試了下 本地php 使用pdo鏈接數據庫 發現是可以連接操作的 經過以前失敗的經驗我可以認為權限問題已經解決了。
所以問題二 php使用mysql不能連接數據庫訪問受限 在倒騰的過程中已經解決了
這里畫下重點:一般情況下 到這里數據庫連接的問題 已經基本解決了
根據查閱的資料,造成不能連接的原因是 mysql 和 mariadb 對於 root 權限管理是不同的,mariadb對於root的權限默認是不開放Gan_priv權限的。另外對於用戶表mariadb添加了兩個新字段,is_role和password_expired。數據庫的表格數也是不同的,老版mysql是24張表左右 而mariadb是30張左右(這里就不去數各個版本的具體數量了,有個概念)
下面繼續直面我的問題
想想如果權限沒有問題了 是不是端口問題呢?
然后使用telnet工具本地 cmd 命令行測試端口開放情況
1、安裝telnet。我的win7下就沒有telnet,在cmd下輸入telnet提示沒有該命令。於是我們進入控制面板---->程序---->打開或關閉windows功能。然后等一段時間,在出來的對話框把telnet客戶端和telnet服務器勾選上,其他的不用管,然后點擊確定。這樣就安裝好了telnet組件了。
2、 下面開始測試某個端口是否開啟,比如我測的是47.104.195.152的 3306 這個端口。在cmd下輸入
telnet 47.104.195.152 3306
而正常的情況是這樣的 跳轉一個新的頁面 如果有疑問可以測試80 或者22 端口我這里是通的
所以現在已經鎖定是端口的問題
下面是一些開放的操作 不過在我這里是沒什么用的 怎么開端口加防火牆規則也么用
我用是阿里雲的服務器
ss -nltp | grep 3306 查看服務端口是否連接
iptables -nL 查看防火牆端口是否開啟
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT 開放防火牆3306端口
經過一系列惡心的嘗試 發現還是不能接通
既然內部不能改變規則 那就去服務器上 阿里雲界面去改試試
這個是案例雲安全組里面的內容 經過添加一定的規則 有了下面的內容 這個3306
開始是沒有的,添加好了規則之后 重啟服務器
ok 鏈接成功 整理一下回去睡覺了 中間還有很多細節沒弄清楚 但是明天還要上班啊
人生什么的還是不要隨便懷疑吧 相信自己。
-------------------------------------------------------------------------------分割線--------------------------------------------------------------------------------------------------------
這里給大家普及一個阿里雲服務器比較實惠的小技巧 在阿里雲創建實例的時候 選擇搶占實例的選項
很適合開發人員進行一次性試驗的時候使用 做一次試驗 部署一台雲服務器 成本控制在2元以內
搶占式實例 搶占式實例 搶占式實例
這個官方的解釋是隨時有可能會釋放 提前5分鍾通知,其實就是把賣不出去的服務器資源便宜賣了,如果資源不夠了再及時收回來。批發改零售嘛!一天兩天的 是不會被回收的!
因為是一次性的想怎么搗鼓怎么搗鼓 如果想在正式服務器上面搗鼓 也不攔着,如果你吼得住的話!