手記系列之四 ----- 關於使用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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章