工具/原料
馬邊彝族ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創新互聯公司的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
已經安裝了mysql數據庫的windows
操作系統
筆者安裝的mysql版本為5.6,即mysql
5.6
方法/步驟
首先,需要關閉mysql
server服務。在“運行”窗口,輸入“services.msc”,進入“服務”窗口。
在服務窗口,可以找到“mysql56”,選定,將其“停止”即可。
這樣,mysql
server服務就停止了。
需要說明的是,這里的“mysql56”受版本限制。舉例來說,如果你的mysql的版本是5.1,那么此時就是就是“mysql51”。
當然,也可以在命令行窗口使用“net
stop
mysql56”來停止服務。
接著,需要使用到mysql的安裝位置。如果忘記了,可以在“開始”按鈕(windows鍵)找到安裝“mysql”文件夾,打開并選擇“mysql
server
5.6”文件夾,會看到兩個mysql
commond
打開的快捷方式。選擇其中的一個查看其屬性,就可以找到mysql的安裝位置。
可以看到我們的mysql位置在“d:\program
files\mysql”
其實,我們之所以想知道mysql的安裝位置,是為了獲取其下的.ini文件的位置。該文件記錄了mysql的配置信息。如果我們想跳過登錄權限,就必須獲取該文件的位置。
需要注意的是,不同版本的.ini文件的名稱不同,在mysql
5.1時,它是my.ini,而在mysql
5.6則是my-default.ini。
接著,打開命令行窗口,輸入如下的命令:
c:\users\wangmysqld
--defaults-file="d:\program
files\mysql\mysql
server
5.6\my-default.ini"
--console
--skip-grant-tables
需要說明的是,此時該窗口不可再寫入。這也是檢驗命令是否正確執行的一個標準。
另外打開一個命令行窗口,輸入命令:mysql
-u
root
-p,回車即可進入mysql命令行界面。
7
接下來,只需要修改系統數據庫,將密碼進行更新即可。
需要使用到的命令是:
mysql-show
database;
mysql-use
mysql
mysql-update
user
set
password=password('12345')
where
user='root';
這樣,就將新密碼設為了12345。
一、背景
近期,公司RDS云產品的MySQL Server版本進行升級,由目前使用的5.7.26版本升級到最新版本5.7.31;升級后測試同學發現:在MySQL創建用戶后,5.7.31版本重新啟動集群會出現啟動失敗的現象;而5.7.26版本在相同測試場景下是正常啟動的。這到底是為什么呢?
二、問題復現
2.1 實驗環境
2.2 操作步驟
按照測試同學的測試步驟,首先創建一個用戶:
然后關閉mysqld;這里需要介紹一下,我們集群的關閉方式是如下方式:
這種方式的內部實現類似于kill -9模式。所以我在線下環境使用kill -9的方式來復現,操作如下:
然后重啟mysqld,操作如下:
此時問題復現了,mysqld啟動失敗,我們查看了下error日志,信息如下:
根據報錯信息可以看出:MySQL的權限系統表發生了損壞,導致了mysqld啟動失敗;由于在MySQL 5.7及其之前版本該表是MyISAM引擎,且該引擎不支持事務,所以在mysqld異常崩潰會導致該類型引擎表的損壞;但在mysqld啟動時是有參數控制MyISAM引擎的恢復模式,且該參數在我們產品中也配置到了my.cnf中,如下所示:
2.3 參數解析
對于該參數的官方文檔的解釋如下:
設置MyISAM存儲引擎恢復模式。選項值是OFF、DEFAULT、BACKUP、FORCE或QUICK的值的任意組合。如果指定多個值,請用逗號分隔。指定不帶參數的選項與指定DEFAULT相同,指定顯式值" "將禁用恢復(與OFF值相同)。如果啟用了恢復,則mysqld每次打開MyISAM表時,都會檢查該表是否標記為已崩潰或未正確關閉。(只有在禁用外部鎖定的情況下運行,最后一個選項才起作用。)在這種情況下,mysqld在表上運行檢查。如果表已損壞,mysqld將嘗試對其進行修復。
服務器自動修復表之前,它將有關修復的注釋寫到錯誤日志中。如果您希望能夠在無需用戶干預的情況下從大多數問題中恢復,則應使用選項BACKUP,FORCE。即使某些行將被刪除,這也會強制修復表,但是它將舊的數據文件保留為備份,以便您以后可以檢查發生了什么。
全局變量,只讀變量,默認為OFF。
三、問題修復
這類MySQL用戶表損耗的問題解決方式也是有多種,我這里列舉其中一種:
(1)my.cnf中的[mysqld]標簽下添加skip_grant_tables,啟動時跳過加載系統字典。
(2)重啟mysqld,然后修復mysql schema下的所有表。
(3)在[mysqld]標簽下注釋或刪除掉skip_grant_tables,然后重啟mysqld。
此時mysqld是可以正常啟動的,無異常。
四、深入排查
在產品化中,以上修復方式很不優雅,只是作為臨時的解決方案;并且也存在一些令人疑惑的點:
帶著這些疑問,我們繼續排查出現該現象的原因;此時Google也沒有找到一些有效的信息,那么只能通過MySQL源代碼來尋找一些答案。
首先需要下載mysql 5.7.31版本的源代碼,并搭建mysql debug環境;具體步驟可以自動Google搜索一下,本文就不再贅述了。
在源代碼中搜索一下關鍵詞,用于打斷點的位置,然后進行調試:
定位到相關代碼,大概是sql/mysqld.cc的4958行,且存在if條件判斷,此時我們開始調試:
通過以上調試信息,可以判斷出acl_init函數返回的值為真;此時我們查看該函數的代碼 (sql/auth/sql_auth_cache.cc:1365):
根據該函數的注釋發現:該函數是初始化負責用戶/數據庫級特權檢查的結構,并從mysql schema中的表中為其加載特權信息;且return值為1代表的是初始化權限失敗。
此后開始逐步調試,觀察return相關信息,當調試到lock_table_names函數時,我們發現在Phase 3時return值為true,且根據代碼注釋發現true代表是Failure;具體代碼如下(sql/sql_base.cc:5549):
調試信息如下:
可以看到flags的值為0,而MYSQL_OPEN_SKIP_SCOPED_MDL_LOCK為宏定義值0x1000,與flags的值 做按位與操作,結果自然也是0,當然MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY也是如此;need_global_read_lock_protection是bool類型值,代表是否需要全局讀鎖的保護,這個值是在table- mdl_request.type不為MDL_SHARED_READ_ONLY發生改變;check_readonly函數相關信息 下面概述。
此時也查看了下MySQL 5.7.26版本代碼作為對比,發現lock_table_names函數下的Phase 3后的部分代 碼是在5.7.29版本后新增的。如果是git clone的MySQL代碼可以用git blame命令查詢文件變化的信息:
上述展示的信息中,最左側的列值為commit id為05824063和0405ebee,有興趣的同學可以詳細看下。
此功能解決的問題是 BUG#28438114: SET READ_ONLY=1 SOMETIMES DOESN'T BLOCK CONCURRENT DDL.;當然這個代碼的變更功能也在5.7 Release Notes中有所體現,如下所示( m/doc/relnotes/mysql/5.7/en/news-5-7-29.html ):
最后我們再查看下check_readonly函數,該函數是基于read_only和super_read_only狀態執行標準化檢查,是禁止(TRUE)還是允許(FALSE)操作。代碼如下(sql/auth/sql_authorization.cc:489):
此時第一反應就是去檢查my.cnf中是否包含read_only相關參數,檢查之后發現確實是使用了該參數, 如下:
此時注釋掉該參數,然后再次啟動mysqld,發現MyISAM表可以自動修復,且正常啟動;error log信息如下:
由于docker一些限制,我們在mysqld啟動會涉及兩次;所以解決該問題的方式為:第一次mysqld的啟動時先關閉read_only參數,第二次啟動時開啟read_only參數。之所以選擇默認開啟read_only參數, 是為了避免在mysqld啟動后,選主邏輯未完成時的保護措施;當然選主完成后,會自動對master執行 set global read_only=0 操作。
五、總結
六、附錄
調試的棧幀信息如下,有興趣的小伙伴可以研究下:
熟悉MySQL體系結構和innodb存儲引擎工作原理;以及MySQL備份恢復、復制、數據遷移等技術;專注于MySQL、MariaDB開源數據庫,喜好開源技術。
原文鏈接:
一、無法訪問系統資源
MySQL 不能訪問啟動需要的資源是造成而 MySQL 無法啟動的一個常見原因,如:文件,端口等。由于 linux 中用于啟動 mysqld 進程的 mysql 用戶通常是不能登陸的,可以使用類似下面的命令檢查文件的訪問權限。
sudo -u mysql touch /var/lib/mysql/b
找出問題后,修改對應文件或目錄的權限或屬主后通常可以解決問題。但有時 mysql 用戶有訪問文件和目錄的權限,但仍然會被拒絕訪問,例如下面這個例子:
mysql system sudo -u mysql touch /home/mysql/data/a
mysql create table t1 (
id int primary key,n varchar(10
) data directory
ERROR 1030 (HY000): Got error 168 from storage engine
測試說明 mysql 用戶有這個目錄的訪問權限,但創建文件還是失敗,這種情況讓很多人困惑,這個時候通常是 mysqld 進程的訪問被 linux 的 selinux 或 apparmor 給阻止了,大家可以看到創建的表不是在 mysql 的默認目錄下面,因此 selinux 或 apparmor 的 policy 里面沒有包含這個目錄的訪問權限,此時只要對應的修改 policy 就行了,當然把 selinux 或 apparmor 停了也行。
有時雖然對系統資源有訪問的權限,但系統資源已經被占用:
mysqld --no-defaults --console --user mysql
2020-11-03T03:36:07.519419Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 21171
2020-11-03T03:36:07.740347Z 1 [ERROR] [MY-012574] [InnoDB] Unable to lock ./ibdata1 error: 11
這個故障產生的原因是另外一個 mysqld 進程已經啟動并占用了對應的文件。
二、參數設置錯誤
參數設置錯誤造成 MySQL 無法啟動的原因也非常常見,此時先要檢查 MySQL 啟動時會調用的參數,下面的命令可以查詢 MySQL 啟動時調用參數文件的順序:
$ mysqld --verbose --help | grep "Default options " -A 1
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
知道了 MySQL 參數文件的調用順序,我們就可以檢查對應的參數文件,找出其中的錯誤,如果覺得參數文件的可讀性不強,可以使用下面的命令顯示 mysqld 程序將要調用的參數:
$ mysqld --print-defaults
/usr/sbin/mysqld would have been started with the following arguments:
......
注意這個命令顯示完參數后就退出,不會真正運行 mysqld。這個命令和 my_print_defaults mysqld 完全是等價的,只不過后者的顯示方式是一行一個參數。
然后開始對可疑的參數進行調試,我個人喜歡加的參數和順序如下:
1. 在 mysqld 后加上第一個參數 --no-defaults ,這個參數的作用是通知 mysqld 在啟動的時候不要讀任何參數文件;
2. 第二個參數是 --console,這個參數會把錯誤信息輸出到屏幕上,這個參數帶來的一個弊端是所有的信息都輸出到屏幕上,讓屏幕顯得比較亂,但對于我們調試卻是很方便的;
3. 第三個參數是 --log-error-verbosity=3,這個參數會顯示詳細的日志;
4. 然后再在后面加上有把握的參數,可以一次只加一個參數,然后啟動 mysqld,采用排除法逐步找出錯誤的參數。
一、mysqld 進程沒有正常運行遇到這種情況首先到服務器上看看 mysqld 進程是否活著,采用的命令:
二、客戶端不能和進程 mysqld 通信如果 MySQL 服務器上的 mysqld 進程運行正常,我們再看看客戶端能不能和 mysqld 進行通信,使用下面的命令進行網絡連通的測試:telnet localhost 3306
如果本地能通,再到客戶端的機器上把 localhost 換成 MySQL 服務器的 ip 地址進行測試。如果不能通,通常有兩種原因,一種原因是 OS 或網絡的問題,或者是防火墻;另一種原因是 mysqld 自身根本沒有偵聽客戶端的連接請求, mysqld 啟動后對于客戶端的偵聽是分三種情況。
第一種情況
是使用參數 --skip-networking 跳過偵聽客戶端的網絡連接,用下面的命令我們可以看到 MySQL 根本沒有偵聽 3306 端口。
第二種情況
使用參數 --bind-address 后面增加對客戶端訪問 IP 地址的限制,例如只偵聽本地的連接
三、賬戶密碼的問題最后一種情況是賬戶密碼的問題,應付這種情況我們有個有力的工具就是查看 MySQL 的 error log, error log 記載信息的詳細程度上由參數 --log-error-verbosity 進行控制的
mysql 服務無法啟動的原因有很多:可能端口被占用;可能my.cnf配置了錯誤的參數;也有可能沒有初始數據庫,還有可能是其他原因。大多數原因都可以通過先注銷掉原有的服務、重新裝載服務、之后再重新啟動的方法解決。也可以嘗試下以下方法:
1、將目錄中配置文件my.default.ini改名為my.ini移至bin目錄下。
2、啟動命令行,將目錄切換到mysql安裝目錄的bin目錄下。
3、接下來,在命令行執行命令:mysqld --initialize --user=mysql --console
4、注意,上一個步驟會獲得一個臨時密碼,需要記錄,之后會用到。
5、接下來在控制臺以命令行輸入:?mysqld --install,進行安裝服務操作。
6、之后,在任務管理器找到“服務”,啟動其中的MYSQL服務即可。
7、之后,輸入命令行mysql -uroot -p,利用之前的臨時密碼輸入即可登錄數據庫成功。
8、修改臨時密碼,設置密碼:mysqladmin -u USER -p password PASSWORD,注意USER和PASSWORD為自己定義的數值。
擴展資料
數據庫就相當于現實中的倉庫。每個數據庫都有一個或多個不同的 API 用于創建,訪問,管理,搜索和復制所保存的數據。我們也可以將數據存儲在文件中,但是在文件中讀寫數據速度相對較慢。
使用關系型數據庫管理系統(RDBMS)來存儲和管理大數據量。所謂的關系型數據庫,是建立在關系模型基礎上的數據庫,借助于集合代數等數學概念和方法來處理數據庫中的數據。MySQL 就是一種關系型數據庫。
如果服務無法啟動,首先查看MySQL的服務是否存在。如果安裝服務失敗,則可新建項MySQL57建立項目。然后找到新建的項,檢查下ImagePath的路徑是否正確。如果路徑不對,修改過來。重啟計算機,再次啟動服務,并可以成功運行MySQL服務。
參考資料:百度百科-MySQL
你好,
1、在計算機管理中,找到本地用戶和組,然后選擇用戶,找到mysql的超級賬戶,然后設置密碼,
2、然后再去計算機管理,選擇服務,找到mysql服務,將密碼設置為和上面的密碼一樣,
3、然后就可以啟動mysql服務了。
名稱欄目:無法使用mysql怎么辦,mysql連接不了怎么辦
網頁URL:http://m.kartarina.com/article32/hegjsc.html
成都網站建設公司_創新互聯,為您提供網站建設、自適應網站、網站設計、、面包屑導航、商城網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯