当MySQL被Oracle收购以后,MySQL的未来充满了不确定性。纵观Oracle历史,简直是闭源收割机。Oracale收购Sun公司以后与Google打了N年官司。之前的Sun公司有两款JDK:SunJDK拥有版权但是免费,OpenJDK开源且免费。这个锅能不能甩到Google身上就看安卓有没有使用SunJDK。而 Google 也觉得自己很委屈毕竟安卓完全开源。后来Google 誓要把 Java 从安卓阵营中剔除出去,而OracleJDK(前身是SunJDK)也走向了收费模式。
数据库数据库的重要性不言而喻,鉴于Oracle之前很多骚操作,为了避免闭源的风险,社区产生了多个MySQL的分支,Mariadb与Percona是当前两个受欢迎的分支。
这里简单说一下Mariadb的渊源。MySQL之父Monty创立了MySQL后将其卖给Sun,结果Sun又转手卖给Oracle,Monty也知道Oracle不靠谱,愤而出走创立了MariaDB分支。从某种程度来说MariaDB可能才是原汁原味。关于MariaDB名字的由来,MySQL的My并不是“我的”意思。My其实是Monty的大女儿,Maria是Monty的小女儿,Monty还有一个儿子Max,所以还有一个MaxDB。
Mariadb某个版本可能只是有限兼容、实现了MySQL一个版本的某些功能,如果遇到问题可以去官网详查下
https://mariadb.com/kb/en/mariadb-vs-mysql-features/
Mysql 和 Mariadb 简单的版本兼容、对应关系:
Mariadb | Mysql |
---|---|
10.4~10.5 | 8.0 |
10.2~10.3 | 5.7 |
10.0~10.1 | 5.6 |
5.5 | 5.5 |
5.1~5.3 | 5.1 |
对应关系比较重要,不然可能出现一些问题。比如sql语句的datetime类型使用错误会建表失败,比如在Web项目中使用mysql的jdbc.driver连接,pom.xml里要选择合适的版本,否则会jdbc连接失败等等。
一、新建repo源
cd /etc/yum.repos.d
vim Mariadb.repo
在 Mariadb.repo下添加镜像地址,为了下载速度快些,这里使用了阿里云镜像
[mariadb]
name = MariaDB
baseurl = https://mirrors.aliyun.com/mariadb/yum/10.4/centos7-amd64
gpgkey = https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1
二、安装Mariadb
yum install MariaDB-server
启动MariaDB服务并设置为开机自启
systemctl start mariadb
systemctl enable mariadb
使用MariaDB安全配置向导
mysql_secure_installation 或者 mariadb-secure-installation
配置时出现的各个选项
Enter current password for root (enter for none): # (输入数据库root密码,第一次进入还没有设置密码则直接回车)
Switch to unix_socket authentication [Y/n]: # n (不使用unix_socket)
Set root password? [Y/n]: # y(root用户设置密码)
New password: # (新密码)
Re-enter new password: # (再次输入密码)
Remove anonymous users? [Y/n]: # y (移除匿名用户)
Disallow root login remotely? [Y/n]:# y (拒绝root远程登录,不管y/n,都会拒绝root远程登录)
Remove test database and access to it? [Y/n]: # y (删除test数据库)
Reload privilege tables now? [Y/n]: # y (重新加载权限表。或者重启服务也许)
三、登录MariaDB
mysql -u root -p
Enter password:
1、修改MariaDB默认编码
MariaDB的默认编码是latin1,插入中文会乱码,需要将编码改为utf8。首先查看当前字符集编码。
MariaDB [(none)]> show variables where variable_name like "%character%" or variable_name like "%collation%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+--------------------------+----------------------------+
- 编辑文件
/etc/my.cnf
, 在[mysqld]
与[mysqld_safe]
标签下添加内容:
vim /etc/my.cnf
[mysqld]
init_connect = 'SET collation_connection = utf8_general_ci'
init_connect = 'SET NAMES utf8'
character_set_server = utf8
collation_server = utf8_general_ci
skip-character-set-client-handshake
[mysqld_safe]
init_connect = 'SET collation_connection = utf8_general_ci'
init_connect = 'SET NAMES utf8'
character_set_server = utf8
collation_server = utf8_general_ci
skip-character-set-client-handshake
- 编辑文件
/etc/my.cnf.d/client.cnf
, 在[client]
标签下添加内容:
vim /etc/my.cnf.d/client.cnf
[client]
default-character-set=utf8
- 编辑文件
/etc/my.cnf.d/mysql-clients.cnf
, 在[mysql]
标签下添加内容:
vim /etc/my.cnf.d/mysql-clients.cnf
[mysql]
default-character-set=utf8
- 重启Mariadb
systemctl restart mariadb
- 查看字符集修改结果
MariaDB [(none)]> show variables where variable_name like "%character%" or variable_name like "%collation%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+--------------------------+----------------------------+
2、配置root远程访问
- 查询账号信息可以看到root账号拒绝了远程访问,localhost表示该账号只能进行本地登录
MariaDB [(none)]> use mysql;
MariaDB [mysql]> select host,user,password from user;
+-----------+-------+-------------------------------------------+
| Host | User | Password |
+-----------+-------+-------------------------------------------+
| localhost | root | *BEDF7627BC4D9FBFF77B8DEAF6AD116AF6B202AC |
| localhost | mysql | invalid |
+-----------+-------+-------------------------------------------+
- 修改访问权限
"%"
代表所有IP,任何客户机都可以连接
localhost
代表只可以本机连接
%
代表所有IP,至于是否已经包括localhost
,各个数据库版本也不一样
版本 | %是否包括localhost |
---|---|
MySQL8.0 | 包括 |
MySQL5.7 | 包括 |
MySQL5.6 | 不包括 |
MySQL5.1 | 不包括 |
MariaDB 10.3 | 不包括 |
访问权限为localhost的root账号不要动,不要动,不要动
。
我这里专门讲%
是否包括localhost
的事情,是因为我曾经有一个掉坑里的故事。我有一次直接把root账户的localhost
改为了%
。比如下面这种:
MariaDB [mysql]> update user set host = '%' where user = 'root';
MariaDB [mysql]> select user,host from user;
+-------+-----------+
| User | Host |
+-------+-----------+
| root | % |
| mysql | localhost |
+-------+-----------+
其结果是,因为某些我万万没有想到的原因,远程无法访问数据库了。而当我登录服务器想本地登录数据库的时候,我发现%
是不包括localhost
的。我整个人都傻掉了,数据库无法远程登录也无法本地登录。后面解决办法是使用了匿名登录和跳过权限验证进去了。
所以上面是一个错误示范,正确的方法应该是insert新用户,而不是update。
下面使用权限命令新建用户:
MariaDB [mysql]> Grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
MariaDB [mysql]> flush privileges;
identified by 后面是账户远程登录的密码。
这里需要说明一下,不要被迷惑,虽然看上去是同为root账户,但其实是是独立的两个账户 root@localhost 与 root@%
MariaDB [mysql]> select user,host,password from user;
+-------+-----------+-------------------------------------------+
| User | Host | Password |
+-------+-----------+-------------------------------------------+
| root | localhost | *BEDF7627BC4D9FBFF77B8DEAF6AD116AF6B202AC |
| mysql | localhost | invalid |
| root | % | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-------+-----------+-------------------------------------------+
它等价于新建一个用户并添加访问权限。
#新建用户yao
MariaDB [mysql]> create user 'yao'@'localhost' identified by '123';
#给yao用户赋权
MariaDB [mysql]> grant all privileges on `yao`.* to 'yao'@'localhost';
MariaDB [mysql]> flush privileges;
- 避免防火墙拦截远程登录
- 关闭防火墙:
systemctl stop firewalld #停止firewall
systemctl disable firewalld #禁止firewall开机启动
- 开放防火墙端口,开启3306端口,开启后要重启防火墙:
firewall-cmd --query-port=3306/tcp # 查看3306端口是否开启
firewall-cmd --zone=public --add-port=3306/tcp --permanent #开启3306端口
firewall-cmd --reload # 重启防火墙
firewall-cmd --query-port=3306/tcp # 查看3306端口是否开启
3. 如果想修改root账号密码
MariaDB [(none)]> SET password for 'root'@'localhost'=password('newpassword');
MariaDB [(none)]> exit;