CentOS7.8從mysql切換到Mariadb的心路歷程

 

因爲MySQL的種種做死操做,逐漸被你們拋棄,因此把服務器上的MySQL切換到MariaDB也被提上了日程。mysql

1、查看系統版本

1.1查看OS版本

cat /etc/redhat-release

查看得知系統內核爲 CentOS Linux release 7.8.2003 (Core),並對須要安裝的MySQL及MariaDB版本進行判斷linux

1.2查看mysql信息

     這裏尤爲注意MySQL中編碼UTF-8的這個坑  :mysql的utf8並非真正意義上的utf8,mysql的utf8只支持最長三個字節,因此Emoji 表情和有些生僻字以及任何新增的 Unicode 字符等若是超過三個字節用utf8字符集保存是會報錯的。mysql在5.5.3以後增長了utf8mb4這個字符集,mb4就是most bytes 4的意思,專門用來兼容四字節的unicode。好在utf8mb4是utf8的超集,除了將編碼改成utf8mb4外不須要作其餘轉換。sql

   若是要轉儲數據,MariaDB是真正的,那麼轉換以前先要在把假的UTF-8轉換爲真的數據庫

#查看mysql版本
select version();
#1.MySQL版本要求:不低於5.5.3(mysql是在5.5.3以後增長了utf8mb4這個字符集)
#2.JDBC驅動版本要求:mysql connector版本高於5.1.13
#查看轉換前的字符集
show variables like '%character%';
show variables like 'collation%'

1.3 數據編碼轉換

#更改數據庫編碼(字符集):
ALTER DATABASE DATABASE_NAME  DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

#更改表編碼(字符集)(注意:這裏修改的是表的字符集,表裏面字段的字符集並無被修改):
ALTER TABLE TABLE_NAME DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 
#更改表編碼(字符集)和表中全部字段的編碼(字符集):

ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

修改原mysql配置信息:安全

/*來自客戶端的語句的字符集*/
set character_set_client = utf8mb4;
/*創建鏈接使用的字符集*/
set character_set_connection = utf8mb4;
/*默認數據庫使用的字符集。當默認數據庫更改時,服務器則設置該變量。若是沒有默認數據庫,變量的值同character_set_server*/
set character_set_database = utf8mb4;
/*用於向客戶端返回查詢結果的字符集*/
set character_set_results = utf8mb4;
/*服務器的默認字符集*/
set character_set_server=utf8mb4;

修改mysql配置文件 、etc/my.cnfbash

[client]
                  default-character-set = utf8mb4
                  [mysql]
                  default-character-set = utf8mb4
                  [mysqld]
                  character-set-client-handshake = FALSE
                  character-set-server = utf8mb4
                  collation-server = utf8mb4_unicode_ci
                  init_connect='SET NAMES utf8mb4'

重啓完檢查編碼是否修改完成服務器

service mysql restart

#登陸mysql,查看編碼方式
show variables like '%character%';
show variables like 'collation%';

2、備份MySQL的數據

這裏直接採用Navicat工具進行備份導出,一樣恢復也用Navicattcp

或者直接用命令行備份:ide

mysqldump --all-databases --user=root --password --master-data > backupdb.sql

命令行還原工具

mysql -u root -p < backupdb.sql

3、安裝MariaDB

3.1 檢查是否安裝及版本

CentOS7 居然自帶MariaDB,省的我下載了都。可是說下,若是CentOS是最小安裝,那麼還得手動來。

3.1.1 下載安裝

這裏就用yum,固然記得修改阿里雲的源,要麼太卡

yum -y install mariadb mariadb-server

3.1.2 啓動及基礎配置

#啓動MariaDB
systemctl start mariadb
#進行MariaDB的相關簡單配置
mysql_secure_installation
#首先是設置密碼,會提示先輸入密碼.。
#Enter current password for root (enter for none):<–初次運行直接回車
#設置密碼
#Set root password? [Y/n] <– 是否設置root用戶密碼,輸入y並回車或直接回車
#New password: <– 設置root用戶的密碼
#Re-enter new password: <– 再輸入一次你設置的密碼
#其餘配置
#Remove anonymous users? [Y/n] <– 是否刪除匿名用戶,回車
#Disallow root login remotely? [Y/n] <–是否禁止root遠程登陸,回車,
#Remove test database and access to it? [Y/n] <– 是否刪除test數據庫,回車
#Reload privilege tables now? [Y/n] <– 是否從新加載權限表,回車
#初始化MariaDB完成

3.2登陸測試

mysql -uroot -p密碼 ,登陸完成以後檢查編碼配置,並進行修改,檢查方式同mysql,再也不贅述

3.3編碼及初始化配置

1.修改/etc/my.cnf文件
命令:vi /etc/my.cnf
在[mysqld]標籤下添加
init_connect=‘SET collation_connection = utf8_unicode_ci’
init_connect=‘SET NAMES utf8’
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
2.修改/etc/my.cnf.d/client.cnf文件
命令:vi /etc/my.cnf.d/client.cnf
在[client]中添加
default-character-set=utf8
3.修改/etc/my.cnf.d/mysql-clients.cnf文件
命令:vi /etc/my.cnf.d/mysql-clients.cnf
在[mysql]中添加
default-character-set=utf8
4.所有配置完成,重啓MariaDB
命令:systemctl restart mariadb

3.4 配置完進行檢查

show variables like 「%character%」;show variables like 「%collation%」 ;

4、遠程登陸及防火牆配置

本地終端登陸已經OK了,那麼試試遠程IP直接登陸:

結果發現提示:root用戶鏈接被拒絕。

4.1 檢查防火牆

CentOS 7 採用的是firewall,它的常見命令以下:

啓動: systemctl start firewalld

關閉: systemctl stop firewalld

查看狀態: systemctl status firewalld 

開機禁用  : systemctl disable firewalld

開機啓用  : systemctl enable firewalld

4.1.1 停用防火牆,新增端口

停用防火牆以後,新增端口,重啓防火牆

#1.查看狀態
 systemctl status firewalld 
#2.查詢端口是否開啓
firewall-cmd --query-port=3306/tcp

firewall-cmd --zone=public --query-port=3306/tcp
#3.添加端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
#4.重啓防火牆
firewall-cmd --reload

發現root仍是沒法登陸,可是在剛開始的時候初始化MariaDB的時候已經配置了容許root遠程登陸呀。

4.1.2檢查MariaDB權限配置

登陸數據庫後,查詢用戶表

mysql> use mysql
#查詢用戶表及權限
mysql> SELECT User, Password, Host FROM user;

若是出現下圖所示,那麼標識root權限未開啓

4.1.3 新增權限

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

上邊這句話就是授予全部權限給root,不管它從任何地方登陸。 其中"*.*"表明全部資源全部權限, 「'root'@%」其中root表明帳戶名,%表明全部的訪問地址,也可使用一個惟一的地址進行替換,只有一個地址可以訪問。若是是某個網段的可使用地址與%結合的方式,如10.0.42.%。IDENTIFIED BY 'root',這個root是指訪問密碼。WITH GRANT OPTION容許級聯受權,能夠不加。

4.1.4刷新權限表

在Linux中也是,好多東西修改完以後不會當即自動刷新,須要人工更新,好比 touch 文件、reload 防火牆。這裏也是須要刷新權限表

mysql> FLUSH PRIVILEGES;

再次嘗試,發現仍是不能登陸,再次檢查受權表,發現root已經有了受權和遠程登陸權限,圖中Host的%便是全部IP,Localhost爲本地,或者爲具體IP限制

4.2 嘗試SSH登陸

嘗試SSH登陸local成功,說明可能系統出於安全考慮,限制了root用戶遠程登陸,即便關閉防火牆也依據攔截?

4.3更換端口

爲了區分是MariaDB仍是OS對3306端口形成的限制,決定修改MariaDB端口。登陸數據庫

show global variables like 'port';

查詢結果爲默認惟一端口 3306

修改默認端口3306爲10240:在my.cnf中的[mysqld]下新增 port=10204

[mysqld]
port=3506

重啓 MariaDB,檢查端口是否修改爲功

netstat -tpln

可是發現本地也能夠登陸,SSH也能夠登陸,就是IP沒法直接登陸。關閉了firewall也無效

考慮是系統fiptable或者SELinux的問題,說明與端口號無關。這個留在故障五里說明

4.4 考慮ROOT用戶因爲安全考慮被限制,使用普通用戶嘗試

4.4.1 建立新的數據庫用戶

#建立用戶
mysql>create user username@localhost identified by 'password';

4.4.2受權給新用戶

mysql>grant all on *.* to username@localhost indentified by 'password';
授予外網登錄權限 

mysql>grant all privileges on *.* to username@'%' identified by 'password';
授予權限而且能夠受權

mysql>grant all privileges on *.* to username@'hostname' identified by 'password' with grant option;

再次查詢受權表

嘗試發現IP遠程登陸、SSH登陸所有成功,再次證實系統對ROOT用戶作了遠程登陸限制,並且這些限制如何解除目前還不清楚

5、故障可能

5.1 Root沒法IP直接登陸

檢查服務UI的安全報告,提到有修改MySQL端口和ROOT和遠程攔截記錄

那麼關閉SELinux ,關閉 firewall

檢查SELinux狀態

[root@dev-server ~]# getenforce
Disabled
[root@dev-server ~]# /usr/sbin/sestatus -v
SELinux status:                 disabled
# 關閉是 disabled 開啓是 permissive

永久關閉SELinux,須要修改配置文件後重啓

vi /etc/selinux/config

將將SELINUX=enforcing改成SELINUX=disabled

關閉firewall,而且去掉開機自啓動

啓動
systemctl start firewalld
 
關閉
systemctl stop firewalld
 
查看狀態
systemctl status firewalld 
 
開機禁用
systemctl disable firewalld
 
開機啓用
systemctl enable firewalld


5.2在運行 mysqldump 命令備份數據庫時出現如下錯誤。

mysqldump: Error: Binlogging on server not active

經過使用 "--master-data",你能夠在導出的輸出中包含二進制日誌信息,這對於數據庫的複製和恢復是有用的。可是,二進制日誌未在 MySQL 服務器啓用。要解決這個錯誤,修改 my.cnf 文件,並在 [mysqld] 部分添加下面的選項。(LCTT 譯註:事實上,若是你並無啓用二進制日誌,那取消"--master-data"便可。)

log-bin=mysql-bin

保存 my.cnf 文件,並從新啓動 MariaDB 服務。

systemctl restart mariadb

相關文章
相關標籤/搜索