手記系列之四 ----- 關於使用MySql的經驗

来源:https://www.cnblogs.com/xuwujing/archive/2023/04/30/17356379.html
-Advertisement-
Play Games

前言 本篇文章主要介紹的關於本人在使用MySql記錄筆記的一些使用方法和經驗,溫馨提示,本文有點長,約1.5w字,幾十張圖片,建議收藏查看。 一、MySql安裝 下載地址:https://dev.mysql.com/downloads/ 在安裝MySql之前,查看是否以及安裝過MySql,如果已經安 ...


前言

本篇文章主要介紹的關於本人在使用MySql記錄筆記的一些使用方法和經驗,溫馨提示,本文有點長,約1.5w字,幾十張圖片,建議收藏查看。

一、MySql安裝

下載地址:https://dev.mysql.com/downloads/

在安裝MySql之前,查看是否以及安裝過MySql,如果已經安裝,但是不符合要求的話就卸載。
如果是windows安裝的話,下載windows的安裝包,一路next下去,設置好賬號和密碼就行了。
1,查找以前是否裝有mysql
先輸入:

rpm -qa|grep -i mysql

查看是否安裝了mysql
這裡寫圖片描述

2,停止mysql服務、刪除之前安裝的mysql
輸入:

ps -ef|grep mysql

刪除命令
輸入:

rpm -e –nodeps 包名

這裡寫圖片描述
如果提示依賴包錯誤,則使用以下命令嘗試

rpm -ev 包名 --nodeps

如果提示錯誤:error: %preun(xxxxxx) scriptlet failed, exit status 1
則用以下命令嘗試:

rpm -e --noscripts 包名

3、查找並刪除mysql目錄
查找結果如下:

find / -name mysql

刪除對應的mysql目錄
具體的步驟如圖:查找目錄並刪除
這裡寫圖片描述
註意:卸載後/etc/my.cnf不會刪除,需要進行手工刪除

4、再次查找機器是否安裝mysql

rpm -qa|grep -i mysql

這裡寫圖片描述

Mysql有兩種安裝模式,可自行選擇。

1.1 yum安裝

首先查看mysql 是否已經安裝
輸入:

rpm -qa | grep mysql   

如果已經安裝,想刪除的話
輸入:
普通刪除命令:

rpm -e mysql

強力刪除命令:

rpm -e --nodeps mysql    

依賴文件也會刪除

安裝mysql
輸入:

yum list mysql-server  

如果沒有,則通過wget命令下載該包
輸入:

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm   

下載成功之後,再輸入命令安裝

yum install mysql-server

在安裝過程中遇到選擇輸入y就行了
這裡寫圖片描述
這裡寫圖片描述

安裝成功後,輸入 service mysqld start 啟動服務
輸入:
mysqladmin -u root -p password '123456'
來設置密碼
輸入之後直接回車(預設是沒有密碼的)
然後再輸入
mysql -u root -p
這裡寫圖片描述
通過授權法更改遠程連接許可權
輸入: grant all privileges on . to 'root'@'%' identified by '123456';
註:第一個’root’是用戶名,第二個’%’是所有的ip都可以遠程訪問,第三個’123456’表示 用戶密碼 如果不常用 就關閉掉
輸入:flush privileges; //刷新

在防火牆關閉之後,使用SQLYog之類的工具測試是否能正確連接

這裡寫圖片描述

1.2 編譯包安裝

將下載好的mysql安裝包上傳到linux伺服器
解壓mysql解壓包,並移動到/usr/local目錄下,重命名為mysql。
命令:

tar -xvf mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.21-linux-glibc2.5-x86_64 /usr/local
cd /usr/local
mv mysql-5.6.21-linux-glibc2.5-x86_64 mysql

這裡寫圖片描述

註: mysql預設的路徑是就是/usr/local/mysql ,如果安裝的地方更改,需要更改相應的配置文件。

安裝mysql

切換到mysql的目錄 /usr/local/mysql
輸入:

 ./scripts/mysql_install_db --user=mysql

這裡寫圖片描述
成功安裝mysql之後,輸入
service mysql start 或 /etc/init.d/mysql start

這裡寫圖片描述
查看是否啟動成功
輸入:

 ps -ef|grep mysql

切換到 /usr/local/mysql/bin 目錄下
設置密碼
mysqladmin -u root password '123456'入mysql
輸入:

mysql -u root -p

設置遠程連接許可權
輸入:

grant all privileges on *.* to 'root'@'%' identified by '123456'; 

然後輸入:

flush privileges;

說明: 第一個’root’是用戶名,第二個’%’是所有的ip都可以遠程訪問,第三個’123456’表示用戶密碼 如果不常用就關閉掉。

使用本地連接工具連接測試

這裡寫圖片描述

二、MySql排查問題的常用命令

1.查看mysql連接數

SHOW FULL PROCESSLIST;

2.查看mysql的配置

show variables like "%innodb%";

3.查看mysql事件是否開啟

show variables like 'event_scheduler';

4.查看mysql鎖的狀態

是否鎖表:

 SHOW OPEN TABLES WHERE In_use > 0;
SHOW INNODB STATUS/G;

5.查看mysql data的存放位置

SHOW VARIABLES LIKE '%datadir%'

6.查看mysql 的超時時間設置

show variables like '%timeout%';

7.查看mysql 的日誌存放

show variables like 'datadir';

mysql的日誌分類
錯誤日誌: -log-err
查詢日誌: -log
慢查詢日誌: -log-slow-queries
更新日誌: -log-update
二進位日誌: -log-bin

8.開啟Mysql的操作日誌記錄

輸入:

  SHOW VARIABLES LIKE 'log_bin'

開啟錯誤日誌:
在my.cnf 或my.ini 中 添加 log-error=/home/mysql/logs/log-error.txt
開啟查詢日誌:
在my.cnf 或my.ini 中 添加 log=/home/mysql/logs/mysql_log.txt

9.查看Mysql緩衝池大小

SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size';

10.當前目錄賦予mysql許可權

chown -R mysql:mysql ./

11.查看mysql臟頁比例

USE performance_schema;
SELECT VARIABLE_VALUE INTO @a FROM global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty';
SELECT VARIABLE_VALUE INTO @b FROM global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total';
SELECT @a/@b;

要合理的設置 innodb_io_capacity 的值,平時要多關註臟頁比例,不讓其接近 75%.
可以通過 innodb_flush_neighbors 來控制該行為,值為 1 打開上述機制,為 0 則關閉。
對於機械硬碟來說,是可以減少很多隨機 IO ,因為機械硬碟 IOPS 一般就幾百,減少隨機 IO 就意味著性能提升。
但如果用 SSD 這類 IOPS 較高的設備,IOPS 往往不是瓶頸,關閉就好,減少 SQL 語句的響應時間。
在 8.0 中,已經預設是 0 了.

12.查看慢查詢以及開啟

SHOW VARIABLES LIKE 'slow_query%';
SET GLOBAL slow_query_log=ON;
set global long_query_time=1;

永久設置

[mysqld]
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1

long_query_time表示查詢超過多少秒就記錄

13. 開啟mysql查詢日誌

開啟會降低性能
查看日誌配置

SHOW VARIABLES LIKE '%general_log%';

查詢文件輸出格式

SHOW VARIABLES LIKE 'log_output';

開啟MySQL查詢日誌

SET  GLOBAL general_log = ON;

關閉MySQL查詢日誌

SET  GLOBAL general_log = OFF;

設置日誌輸出方式為表

SET GLOBAL log_output='table';

查詢日誌信息

select * from mysql.general_log;

14.資料庫慢或資料庫連接過多的命令排查

按客戶端 IP 分組,看哪個客戶端的鏈接數最多

SELECT client_ip,COUNT(client_ip) AS client_num FROM (SELECT
SUBSTRING_INDEX(HOST,':' ,1) AS client_ip FROM PROCESSLIST ) AS
connect_info GROUP BY client_ip ORDER BY client_num DESC;

查看正在執行的線程,並按 Time 倒排序,看看有沒有執行時間特別長的線程

SELECT * FROM information_schema.processlist WHERE Command != 'Sleep'
ORDER BY TIME DESC;

找出所有執行時間超過 5 分鐘的線程,拼湊出 kill 語句,方便後面查殺

SELECT CONCAT('kill ', id, ';') FROM information_schema.processlist
WHERE Command != 'Sleep' AND TIME > 300 ORDER BY TIME DESC;

批量kill的語句

 select concat('KILL ',a.trx_mysql_thread_id ,';') from INFORMATION_SCHEMA.INNODB_LOCKS b,INFORMATION_SCHEMA.innodb_trx a where b.lock_trx_id=a.trx_id into outfile '/tmp/kill.txt';

三、MySql的優化建議

1.建表建議

1.1 選擇索引的數據類型

MySQL支持很多數據類型,選擇合適的數據類型存儲數據對性能有很大的影響。通常來說,可以遵循以下一些指導原則:
1.越小的數據類型通常更好:
越小的數據類型通常在磁碟、記憶體和CPU緩存中都需要更少的空間,處理起來更快。
2.簡單的數據類型更好:
整型數據比起字元,處理開銷更小,因為字元串的比較更複雜。在MySQL中,應該用內置的日期和時間數據類型,而不是用字元串來存儲時間;以及用整型數據類型存儲IP地址。
3.儘量避免NULL:
應該指定列為NOT NULL,除非你想存儲NULL。在MySQL中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計信息以及比較運算更加複雜。你應該用0、一個特殊的值或者一個空串代替空值。
4.一個表的索引最好不要超過6個:
索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引

1.2 選擇主鍵類型

選擇合適的標識符是非常重要的。選擇時不僅應該考慮存儲類型,而且應該考慮MySQL是怎樣進行運算和比較的。一旦選定數據類型,應該保證所有相關的表都使用相同的數據類型。

  1. 整型:
    通常是作為標識符的最好選擇,因為可以更快的處理,而且可以設置為AUTO_INCREMENT。
  2. 字元串:
    儘量避免使用字元串作為標識符,它們消耗更好的空間,處理起來也較慢。而且,通常來說,字元串都是隨機的,所以它們在索引中的位置也是隨機的,這會導致頁面分裂、隨機訪問磁碟,聚簇索引分裂(對於使用聚簇索引的存儲引擎)。

Mysql常見索引有:主鍵索引、唯一索引、普通索引、全文索引、組合索引
PRIMARY KEY(主鍵索引) ALTER TABLE table_name ADD PRIMARY KEY ( col )
UNIQUE(唯一索引) ALTER TABLE table_name ADD UNIQUE (col)
INDEX(普通索引) ALTER TABLE table_name ADD INDEX index_name (col)
FULLTEXT(全文索引) ALTER TABLE table_name ADD FULLTEXT ( col )
組合索引 ALTER TABLE table_name ADD INDEX index_name (col1, col2, col3 )
Mysql各種索引區別:
普通索引:最基本的索引,沒有任何限制
唯一索引:與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。
主鍵索引:它 是一種特殊的唯一索引,不允許有空值。
全文索引:僅可用於 MyISAM 表,針對較大的數據,生成全文索引很耗時好空間。
聯合索引:為了更多的提高mysql效率可建立組合索引,遵循”最左首碼“原則。創建複合索引時應該將最常用(頻率)作限制條件的列放在最左邊,依次遞減。
聯合索引的好處:覆蓋索引,這一點是最重要的,眾所周知非主鍵索引會先查到主鍵索引的值再從主鍵索引上拿到想要的值。但是覆蓋索引可以直接在非主鍵索引上拿到相應的值,減少一次查詢。
複合索引和普通索引都是用一棵B+樹表示的。
如果是單列,就按這列key數據進行排序。
如果是多列,就按多列數據排序,
例如有(1,1)(1,4)(2,2)(1,3) (2,1)(1,2)(2,3) (2,4)
那在索引中的葉子節點的數據順序就是(1,1)(1,2)(1,3) (1,4)(2,1)(2,2)(2,3) (2,4)
這也是為什麼查詢複合索引的首碼是可以用到索引的原因

在這裡插入圖片描述

1.3 mysql索引方法hash和Btree區別

Hash僅支持=、>、>=、<、<=、between。BTree可以支持like模糊查詢
索引是幫助mysql獲取數據的數據結構。最常見的索引是Btree索引和Hash索引。
不同的引擎對於索引有不同的支持:Innodb和MyISAM預設的索引是Btree索引;而Mermory預設的索引是Hash索引。
我們在mysql中常用兩種索引演算法BTree和Hash,兩種演算法檢索方式不一樣,對查詢的作用也不一樣。
一、BTree
BTree索引是最常用的mysql資料庫索引演算法,因為它不僅可以被用在=,>,>=,<,<=和between這些比較操作符上,而且還可以用於like操作符,只要它的查詢條件是一個不以通配符開頭的常量,例如:
select * from user where name like ‘jack%’;
select * from user where name like ‘jac%k%’;
如果一通配符開頭,或者沒有使用常量,則不會使用索引,例如:
select * from user where name like ‘%jack’;
select * from user where name like simply_name;
二、Hash
Hash索引只能用於對等比較,例如=,<=>(相當於=)操作符。由於是一次定位數據,不像BTree索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次IO訪問,所以檢索效率遠高於BTree索引。
但為什麼我們使用BTree比使用Hash多呢?主要Hash本身由於其特殊性,也帶來了很多限制和弊端:
1.Hash索引僅僅能滿足“=”,“IN”,“<=>”查詢,不能使用範圍查詢。
2.聯合索引中,Hash索引不能利用部分索引鍵查詢。
對於聯合索引中的多個列,Hash是要麼全部使用,要麼全部不使用,並不支持BTree支持的聯合索引的最優首碼,也就是聯合索引的前面一個或幾個索引鍵進行查詢時,Hash索引無法被利用。
3.Hash索引無法避免數據的排序操作
由於Hash索引中存放的是經過Hash計算之後的Hash值,而且Hash值的大小關係並不一定和Hash運算前的鍵值完全一樣,所以資料庫無法利用索引的數據來避免任何排序運算。
4.Hash索引任何時候都不能避免表掃描
Hash索引是將索引鍵通過Hash運算之後,將Hash運算結果的Hash值和所對應的行指針信息存放於一個Hash表中,由於不同索引鍵存在相同Hash值,所以即使滿足某個Hash鍵值的數據的記錄條數,也無法從Hash索引中直接完成查詢,還是要通過訪問表中的實際數據進行比較,並得到相應的結果。
5.Hash索引遇到大量Hash值相等的情況後性能並不一定會比BTree高
對於選擇性比較低的索引鍵,如果創建Hash索引,那麼將會存在大量記錄指針信息存於同一個Hash值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表數據訪問,而造成整體性能底下。

  1. hash索引查找數據基本上能一次定位數據,當然有大量碰撞的話性能也會下降。而btree索引就得在節點上挨著查找了,很明顯在數據精確查找方面hash索引的效率是要高於btree的;
  2. 那麼不精確查找呢,也很明顯,因為hash演算法是基於等值計算的,所以對於“like”等範圍查找hash索引無效,不支持;
  3. 對於btree支持的聯合索引的最優首碼,hash也是無法支持的,聯合索引中的欄位要麼全用要麼全不用。提起最優首碼居然都泛起迷糊了,看來有時候放空得太厲害;
  4. hash不支持索引排序,索引值和計算出來的hash值大小並不一定一致。

1.4 mysql不走索引的情況

  1. 數據量太少:
    如果表中的行數很少,MySQL可能會選擇全表掃描而不是使用索引。

  2. 索引列被函數處理:
    如果查詢中對索引列進行了函數處理,MySQL就無法使用該索引進行優化,例如:

SELECT * FROM table WHERE YEAR(date_column) = 2021;

將無法使用date_column上的索引進行優化。

  1. 索引列被類型轉換:
    如果查詢中對索引列進行了類型轉換,MySQL也無法使用該索引進行優化,例如:
SELECT * FROM table WHERE int_column = '1';

將無法使用int_column上的索引進行優化。

  1. 索引列被模糊查詢:
    如果查詢中對索引列進行了模糊查詢(如使用LIKE, 非左匹配),MySQL也無法使用該索引進行優化。

  2. 多列索引未使用首碼:
    如果使用了多列索引,並且查詢中只使用了其中的一部分列,但是沒有使用首碼,MySQL也無法使用該索引進行優化。

  3. 索引列存在NULL值:
    如果索引列存在NULL值,MySQL可能無法使用該索引進行優化。

  4. 查詢條件中包含OR、NOT、IN以及子查詢的情況。

  5. 使用聯合索引但是查詢條件順序不正確。

  6. left join 字元集不一致

    這種情況並非常見
    可以通過以下語句查看:
    
    SHOW FULL COLUMNS FROM table1;
    SHOW FULL COLUMNS FROM table2;
    

2.查詢優化建議

通過關鍵字 EXPLAIN 在查詢語句前面加上可以查看索引走向
從上到下,性能從差到好

  • all 全表查詢
  • index 索引全掃描
  • range 索引範圍掃描
  • ref 使用非唯一或唯一索引的首碼掃描,返回相同值的記錄
  • eq_ref 使用唯一索引,只返回一條記錄
  • const,system 單表中最多只有一行匹配,根據唯一索引或主鍵進行查詢
  • null 不訪問表或索引就可以直接得到結果

優化建議:

  • JOIN 後的的條件必須是索引,最好是唯一索引,否則數據一旦很多會直接卡死

  • 一般禁止使用UNIION ON,除非UNION ON 前後的記錄數很少

  • 禁止使用OR

  • 查總數使用COUNT(*)就可以,不需要COUNT(ID),MYSQL會自動優化

  • 資料庫欄位設置 NOT NULL,欄位類型 INT > VARCHAR 越小越好

  • 禁止SELECT * ,需要確定到使用的欄位

  • 一般情況不在SQL中進行數值計算

3. 總數查詢優化 建議

1.如果未設置主鍵,也未設置索引,可以對整型的欄位添加索引
2.通過一個中間表來記錄資料庫內各表記錄總數,然後通過觸發器進行監聽該表,實時更新總條數.

觸發器:
CREATE
TRIGGER 資料庫名.觸發器名 BEFORE/AFTER INSERT/UPDATE/DELETE
ON 資料庫名.<Table Name>
FOR EACH ROW
BEGIN
事件發生後執行的代碼
END

創建示例:
當test_count表添加了數據,就對MT_COUNT的總數進行更新。

DELIMITER $$
CREATE
    TRIGGER `ROWS_COUNT` BEFORE  INSERT
    ON `test_count`
    FOR EACH ROW BEGIN		
	UPDATE MT_COUNT SET rowcount=rowcount+1 WHERE tablename = 'test_count';
    END$$
DELIMITER ;

3.分頁查詢只第一次查詢總數,或者分頁查詢和總數查詢分開。

4.提升MySql寫入速度建議

innodb_buffer_pool_size

如果用Innodb,那麼這是一個重要變數。相對於MyISAM來說,Innodb對於buffer
size更敏感。MySIAM可能對於大數據量使用預設的key_buffer_size也還好,但Innodb在大數據量時用預設值就感覺在爬了。
Innodb的緩衝池會緩存數據和索引,所以不需要給系統的緩存留空間,如果只用Innodb,可以把這個值設為記憶體的70%-80%。和
key_buffer相同,如果數據量比較小也不怎麼增加,那麼不要把這個值設太高也可以提高記憶體的使用率。

innodb_additional_pool_size

這個的效果不是很明顯,至少是當操作系統能合理分配記憶體時。但你可能仍需要設成20M或更多一點以看Innodb會分配多少記憶體做其他用途。

innodb_log_file_size

對於寫很多尤其是大數據量時非常重要。要註意,大的文件提供更高的性能,但資料庫恢復時會用更多的時間。一般用64M-512M,具體取決於伺服器的空間。

innodb_log_buffer_size

預設值對於多數中等寫操作和事務短的運用都是可以的。如
果經常做更新或者使用了很多blob數據,應該增大這個值。但太大了也是浪費記憶體,因為1秒鐘總會
flush(這個詞的中文怎麼說呢?)一次,所以不需要設到超過1秒的需求。8M-16M一般應該夠了。小的運用可以設更小一點。

innodb_flush_log_at_trx_commit (這個很管用)

抱怨Innodb比MyISAM慢
100倍?那麼你大概是忘了調整這個值。預設值1的意思是每一次事務提交或事務外的指令都需要把日誌寫入(flush)硬碟,這是很費時的。特別是使用電
池供電緩存(Battery backed up
cache)時。設成2對於很多運用,特別是從MyISAM表轉過來的是可以的,它的意思是不寫入硬碟而是寫入系統緩存。日誌仍然會每秒flush到硬
盤,所以你一般不會丟失超過1-2秒的更新。設成0會更快一點,但安全方面比較差,即使MySQL掛了也可能會丟失事務的數據。而值2只會在整個操作系統
掛了時才可能丟數據。

四、MySql遇到的問題以及解決辦法

1. mysql離線安裝出現:Can't change to run as user 'mysql' ; Please check that the user exists!

原因:沒有該用戶。
解決辦法:創建該用戶!
例如:
添加用戶:

groupadd -g 315 mysql

用戶加入mysql:

useradd -u 315 -g mysql -d /usr/local/mysql -M mysql

再次輸入

 ./scripts/mysql_install_db --user=mysql

成功!

2,安裝完mysql之後,輸入service mysql start 提示 mysql: unrecognized service。

問題原因: 是因為/etc/init.d/ 不存在 mysql 這個命令,所以無法識別。
解決辦法:
1.首先查找mysql.server文件在哪
輸入:
find / -name mysql.server
2.將mysql.server 複製到/etc/init.d/目錄下,並重命名為mysql或mysqld

輸入:
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
3.測試是否可以使用該命令
輸入:
service mysql status

service mysqld status

3. 打開mysql出現:Got error 28 from storage engine

原因:mysql伺服器的存儲空間不夠了,清空不用的數據就可以使用了。

4. Data too long for column 異常

1.資料庫中設置的字元長度不夠

找到對應的欄位,將字元長度加長一些。

2.編碼導致的原因,一般是由於輸入了中文,才會出現類似的錯誤
統一設置為UTF-8

5. Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

登錄出現此異常
原因: 沒有找到該文件,可以在/etc/my.cnf 文件中確認該文件的位置,若確定,這查看此文件的許可權,若許可權也ok,則添加 軟鏈,
例如:
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

若還不行,則通過 mysql -uroot -p -S /var/run/mysqld/mysqld.sock 直接登錄,不輸入密碼 。登錄成功之後,在通過添加軟鏈重新啟動。

6. 登錄mysql報錯-bash: mysql: 未找到命令

原因:這是由於系統預設會查找/usr/bin下的命令,如果這個命令不在這個目錄下,當然會找不到命令,我們需要做的就是映射一個鏈接到/usr/bin目錄下,相當於建立一個鏈接文件。
首先得知道mysql命令或mysqladmin命令的完整路徑,比如mysql的路徑是:/usr/local/mysql/bin/mysql,我們則可以這樣執行命令:

ln -s /usr/local/mysql/bin/mysql /usr/bin

以下是補充:

linux下,在mysql正常運行的情況下,輸入mysql提示:
mysql command not found

遇上-bash: mysql: command not found的情況彆著急,這個是因為/usr/local/bin目錄下缺失mysql導致,只需要一下方法建立軟鏈接,即可以解決:
把mysql安裝目錄,比如MYSQLPATH/bin/mysql,映射到/usr/local/bin目錄下:

cd /usr/local/bin
ln -fs /MYSQLPATH/bin/mysql mysql

還有其它常用命令mysqladmin、mysqldump等不可用時候都可按用此方法解決。
註:其中MYSQLPATH是mysql的實際安裝路徑。

7. initialize specified but the data directory has files in it. Aborting

報這個錯誤的原因是因為你的mysql資料庫已經進行初始化了,所以不能用這種方式再進行初始化用戶了,因為mysql在初始化的時候會自動創建一個root用戶的。更改/etc/cnf 的配置就行。

8.The server quit without updating PID file

錯誤信息詳細描述:
root@MyServer:~# service mysql start
Starting MySQL
..The server quit without updating PID file (/usr/local/mysql/var/MyServer.pid). ... failed!

錯誤解決排查思路:
1.可能是/usr/local/mysql/data/rekfan.pid文件沒有寫的許可權
解決方法 :給予許可權,執行 “chown -R mysql:mysql /var/data” “chmod -R 755 /usr/local/mysql/data” 然後重新啟動mysqld!

2.可能進程里已經存在mysql進程
解決方法:用命令“ps -ef|grep mysqld”查看是否有mysqld進程,如果有使用“kill -9 進程號”殺死,然後重新啟動mysqld!

3.可能是第二次在機器上安裝mysql,有殘餘數據影響了服務的啟動。
解決方法:去mysql的數據目錄/data看看,如果存在mysql-bin.index,就趕快把它刪除掉吧,它就是罪魁禍首了。

4.mysql在啟動時沒有指定配置文件時會使用/etc/my.cnf配置文件,請打開這個文件查看在[mysqld]節下有沒有指定數據目錄(datadir)。
解決方法:請在[mysqld]下設置這一行:datadir = /usr/local/mysql/data

5.skip-federated欄位問題
解決方法:檢查一下/etc/my.cnf文件中有沒有沒被註釋掉的skip-federated欄位,如果有就立即註釋掉吧。

6.錯誤日誌目錄不存在
解決方法:使用“chown” “chmod”命令賦予mysql所有者及許可權

7.selinux惹的禍,如果是centos系統,預設會開啟selinux
解決方法:關閉它,打開/etc/selinux/config,把SELINUX=enforcing改為SELINUX=disabled後存檔退出重啟機器試試。

9.Failed to start mysql.service: Unit not found. Mysql

systemctl list-unit-files --type=service | grep mysql
service mysqld.service start

在這裡插入圖片描述

10.mysqldump: Got error: 1045: Unknown error 1045 when trying to connect

添加雙引號
在這裡插入圖片描述

11.mysql 寫入生僻字或特殊字元錯誤的解決辦法

問題: 插入SQ語句出現 Incorrect string value: '\xF0\xA1\x8B\xBE\xE5\xA2...' for column 'name',這種錯誤,資料庫編碼設置已經是utf-8 ,插入其他的非特殊字元的語句正確。

解決辦法 : mysql 版本5.5.3以後,有了一個utf8mb4編碼,是utf8的超集,也相容unicode 。所以將編碼格式改為這個就可以了。
在my.cnf或my.ini中添加:

[client]
default-character-set = utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[mysql]
default-character-set = utf8mb4 

其他

參考:
http://blog.csdn.net/zq199692288/article/details/78863737
https://blog.csdn.net/hjf161105/article/details/78850658
https://blog.csdn.net/everda/article/details/77476716
http://blog.itpub.net/29654823/viewspace-2150471

關於sql相關的文章:
https://www.cnblogs.com/xuwujing/category/1081197.html

非常好聽的音樂~

原創不易,如果感覺不錯,希望給個推薦!您的支持是我寫作的最大動力!
版權聲明:
作者:虛無境
博客園出處:http://www.cnblogs.com/xuwujing
CSDN出處:http://blog.csdn.net/qazwsxpcm    
個人博客出處:https://xuwujing.github.io/

如果你對生活感覺到了絕望,請不要氣餒。因為這樣只會讓你更加絕望! 所謂的希望往往都是在絕望中萌發的,所以,請不要放棄希望!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在前幾篇文章中`LyShark`通過多種方式實現了驅動程式與應用層之間的通信,這其中就包括了通過運用`SystemBuf`緩衝區通信,運用`ReadFile`讀寫通信,運用`PIPE`管道通信,以及運用`ASYNC`反向通信,這些通信方式在應對`一收一發`模式的時候效率極高,但往往我們需要實現一次性... ...
  • P6818 [PA2013]Działka 前言 我太菜了。。。。 對著 jiangly 大佬的題解研究了一下午研究了一下午才搞出來(淚目。 作為一個蒟蒻,我就詳細的講一下我對與本題的理解。 題意 本題的的題意描述的還是比較明瞭。 在二維坐標系中,輸入 $n$ 個點 $m$ 次詢問, 每次詢問,給出 ...
  • 測試環境 Python 3.6.2 代碼實現 非多線程場景下使用 新建並保存EXCEL import win32com.client from win32api import RGB def save_something_to_excel(result_file_path): excel_app = ...
  • 以前寫的C++基本都是C with STL,大多是面向過程的演算法題,或者比較小的項目,然後經常報各種編譯錯誤(對編譯原理不熟),經常把人搞到崩潰,搞不懂構建、鏈接之類的東西。 現在開始記錄一下XMake的學習筆記,記錄一些學習過程中踩的坑,在這篇文章,你將學習到Windows下利用MSYS2進行Mi ...
  • 在.NET Core部署到linux(CentOS)最全解決方案,常規篇一文,我們詳細講解了傳統的.NET Core部署到Linux伺服器的方法,學到了Linux在虛擬機下的安裝、Xshell,Xftp的使用方法、git在linux下的交互使用以及.net core在linux下的發佈與運行全過程。... ...
  • 最近遇到公司的一個項目,需要將多張圖片合併成一個播放的視頻,找了很多資料和嘗試了工具,遇到很多的坑,這裡記下來,希望大家也能順利解決遇到的問題。 合併視頻,主要可以借用OpenCV 和 ffmpeg,這裡是嘗試用ffmpeg.exe的工具去實現圖片文件合併成視頻。 輸入存儲視頻文件的路徑,通過Pro ...
  • 痞子衡嵌入式半月刊: 第 76 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
  • (Linux安裝軟體) 前言 這期呢主要說一說Linux中包軟體管理相關命令,這一期的命令雖然只有兩個。但 軟體包的安裝和卸載都是我們平常最常用的,需要熟練掌握。 rpm和yum 是CentOS 主要的包軟體管理。 兩個命令各有用處,①yum需要互聯網,yum會去網上的yum源獲取所需的軟體包 ② ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...