因爲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 命令備份數據庫時出現如下錯誤。
經過使用 "--master-data",你能夠在導出的輸出中包含二進制日誌信息,這對於數據庫的複製和恢復是有用的。可是,二進制日誌未在 MySQL 服務器啓用。要解決這個錯誤,修改 my.cnf 文件,並在 [mysqld] 部分添加下面的選項。(LCTT 譯註:事實上,若是你並無啓用二進制日誌,那取消"--master-data"便可。)
log-bin=mysql-bin
保存 my.cnf 文件,並從新啓動 MariaDB 服務。
systemctl restart mariadb