MariaDB入门

2018-02-25|Categories: Database|

安装MariaDB-server

Yum安装

系统自带版本

CentOS 7系统自带的MariaDB版本是5.5.56

yum install mariadb-server

Yum会自动安装依赖包,包括客户端工具包mariadb,这个包提供了连接MariaDB-server的客户端mysql,以及其它许多二进制可执行文件。

官网最新版

写这篇文章时,MariaDB官网的最新稳定版是10.2.13,先配置yum仓库:

vim /etc/yum.repos.d/mariadb.repo

粘贴以下内容:

# MariaDB 10.2 CentOS repository list - created 2018-02-25 08:57 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

这些内容来自官方的yum仓库生成器。但问题是,官方源的服务器在国外,下载速度非常慢,大陆用户建议用阿里云的镜像源,只需要修改baseurl

baseurl = http://mirrors.aliyun.com/mariadb/mariadb-10.2.13/yum/centos7-amd64/

与之前安装5.5版不同,安装最新的10.x版本必须区分MariaDB-server的大小写:

yum install MariaDB-server

Yum会自动用新版替换之前安装的旧版:

安装结果如下,如果之前修改了/etc/my.cnf,yum不会将其覆盖,而是新建一个/etc/my.cnf.rpmnew

注意:

  • 和其它开源产品不同,通过浏览器访问镜像网站的MariaDB目录不会直接显示文件列表,而是跳转到MariaDB官方下载页面,个人推测可能是为了推广MariaDB这个品牌和它的官方网站。
  • 如果需要从阿里云镜像下载MariaDB的其它版本,修改baseurl包含的版本号即可,例如把10.2.13替换为5.5.59,浏览器下载和yum下载都可以使用这种方式。

启动服务

在启动服务时,10.x版本和5.5版本的服务名称没有区别,都是小写的mariadb

systemctl start mariadb

启动成功之后,需要用mysql这个客户端连接到MariaDB-server:

# 刚安装完,尚未设置密码
mysql

# 已设置密码
mysql -uroot -p

从以上一系列安装、启动、连接数据库的操作中可以发现,MariaDB虽说在品牌上已经成功的另起炉灶,但毕竟源自MySQL的代码库,二者很难从根本上切割,导致新用户很容易被名称上细小的差别搞糊涂。

执行安全脚本

mysql_secure_installation

这个脚本会执行以下任务:

  • Change the root password
  • Remove anonymous users
  • Disallow root login remotely
  • Remove test database and access to it
  • Reload privilege tables

也可以手动执行以上任务,实际上就是操作mysql数据库的user表和test数据库。

编译安装

自动解决编译依赖

编译安装,尤其是编译复杂应用程序,最关键、也最让人头疼的步骤就是手工解决依赖关系,如果没有详细的文档,用户就像在漆黑的夜晚走在崎岖的山路上,只能艰难的摸索前行,而一次又一次编译失败足以让任何人都恨不得砸电脑、掀桌子!

幸运的是,优秀的包管理器可以自动解决编译依赖,例如,在CentOS上解决MariaDB-server的编译依赖的命令如下:

yum-builddep mariadb [-y]

yum-builddep命令由yum-utils包提供,它能解决的编译依赖远远不止一个MariaDB,常见的php、httpd都没有问题。坦白说,从MariaDB官方撰写的Build Environment Setup for Linux看到这个技巧的时候,我油然而生一种「往事不堪回首」的感慨。

根据man yum-builddep的说法:

Note, that only the BuildRequires information within the SRPM header information is used to determine build dependencies.

我推测只要是上游仓库编译过的包都可以通过yum-builddep自动解决编译依赖。

在CentOS 7执行yum-builddep命令非常顺利,但在CentOS 6执行时出现「找不到源RPM」的提示:

$ yum-builddep mysql php httpd
Loaded plugins: fastestmirror
Enabling epel-source repository
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
No source RPM found for php-5.3.3-49.el6.x86_64
No source RPM found for httpd-2.2.15-60.el6.centos.4.x86_64
No source RPM found for httpd-2.2.15-59.el6.centos.x86_64
No source RPM found for mysql-5.1.73-8.el6_8.x86_64
No source RPM found for httpd-2.2.15-60.el6.centos.6.x86_64
No source RPM found for httpd-2.2.15-60.el6.centos.5.x86_64
No uninstalled build requires

经过搜索,发现是因为CentOS 6相比CentOS 7少了一个CentOS-Sources.repo仓库文件,于是从CentOS 7上把文件复制过来,再执行一个替换命令:

sed -i -r 's/(RPM-GPG-KEY-CentOS-)7$/\16/' /etc/yum.repos.d/CentOS-Sources.repo

就变成了CentOS 6可用的CentOS-Sources.repo仓库文件:

# CentOS-Sources.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[base-source]
name=CentOS-$releasever - Base Sources
baseurl=http://vault.centos.org/centos/$releasever/os/Source/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#released updates
[updates-source]
name=CentOS-$releasever - Updates Sources
baseurl=http://vault.centos.org/centos/$releasever/updates/Source/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that may be useful
[extras-source]
name=CentOS-$releasever - Extras Sources
baseurl=http://vault.centos.org/centos/$releasever/extras/Source/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that extend functionality of existing packages
[centosplus-source]
name=CentOS-$releasever - Plus Sources
baseurl=http://vault.centos.org/centos/$releasever/centosplus/Source/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

这些仓库默认都没有启用,但执行yum-builddep命令时会自动启用,所以不需要手工启用。

在Ubuntu和OpenSUSE上也有类似的方法:

# for Debian and Ubuntu-based distributions
sudo apt-get build-dep mysql-server 

# for OpenSUSE
sudo zypper si -d mysql-community-server 

基本编译选项

解决了最关键的编译依赖,剩下的就是根据需要配置编译选项了,而这也正是编译安装的精髓。我主要是为了掌握编译安装MariaDB的技能,而不是追求性能优化,所以仅使用了基本的编译选项:

cmake . \
    -DCMAKE_INSTALL_PREFIX="/app/mariadb"       \
    -DMYSQL_DATADIR="/data/mariadb"             \
    -DMYSQL_UNIX_ADDR="/app/mariadb/mysql.sock" \
    -DMYSQL_USER=mysql                          \
    -DDEFAULT_CHARSET=utf8                      \
    -DDEFAULT_COLLATION=utf8_general_ci         \
    -DENABLED_LOCAL_INFILE=1                    \
    -DWITH_ARCHIVE_STORAGE_ENGINE=1             \
    -DWITH_BLACKHOLE_STORAGE_ENGINE=1           \
    -DWITH_INNOBASE_STORAGE_ENGINE=1            \
    -DWITH_PARTITION_STORAGE_ENGINE=1           \
    -DWITHOUT_MROONGA_STORAGE_ENGINE=1          \
    -DWITH_DEBUG=0                              \
    -DWITH_LIBWRAP=0                            \
    -DWITH_READLINE=1                           \
    -DWITH_SSL=system                           \
    -DWITH_ZLIB=system

注意,从5.5版开始,MariaDB需要通过cmake编译:

To build MariaDB of a version 5.5 and above you need to install cmake. If you want to build .rpm packages, you need at least cmake 2.8.7. Otherwise cmake 2.6 will do.

https://mariadb.com/kb/en/library/source-building-mariadb-on-centos/

以上的选项指定编译安装MariaDB的目录是/app/mariadb,数据库文件存放目录是/data/mariadb,Socket文件是/app/mariadb/mysql.sock,而mysqld进程由mysql用户执行,因此必须保证mysql用户对这些目录有「写入」权限,否则将无法启动。

同时,这里还指定了默认字符集是utf8,而通过yum安装或二进制安装的默认字符集都是latin1

最后就是编译了:

make && make install

MariaDB的编译过程非常漫长,反正我是选在午餐时间编译,吃完饭回来大约40分钟,刚刚编译完毕。

我编写了脚本用于自动编译安装LAMP,详见《Install LAMP on CentOS 6 & 7》

二进制安装

Yum安装不够灵活,编译安装又太耗时间,还需要对编译选项非常了解,这都算是缺点。二进制安装很好的弥补了这两个缺点,步骤如下:

下载、解压二进制包

# 创建专门的目录存放二进制包或源码包,以便共享给局域网内的机器
# 创建成功后直接进入该目录
mkdir /src && cd $_

# 下载二进制包
wget http://mirrors.aliyun.com/mariadb/mariadb-10.2.14/bintar-linux-x86_64/mariadb-10.2.14-linux-x86_64.tar.gz

# 校验二进制包的完整性
wget http://mirrors.aliyun.com/mariadb/mariadb-10.2.14/bintar-linux-x86_64/sha512sums.txt
sha512sum -c sha512sums.txt | grep -i ok

# 将二进制包解压到`/usr/local/`
tar xvf mariadb-10.2.14-linux-x86_64.tar.gz -C /usr/local/

# 创建`mysql`软链接,方便以后安装其它版本的MariaDB
cd /usr/local
ln -s mariadb-10.2.14-linux-x86_64/ mysql

# 创建`mysql`用户,专门运行MariaDB
useradd -r mysql -s /sbin/nologin

# 把`mysql`软链接指向的目录的所有者和组都改成`mysql`
chown -R mysql.mysql mysql/

# 把MariaDB自带的二进制可执行文件的目录添加到环境变量
echo 'PATH="/usr/local/mysql/bin:$PATH"' > /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh

初始化数据库文件

cd /usr/local/mysql

# 创建存放数据库文件的目录,根据实际需要来设置
mkdir -p /data/mariadb
chown -R mysql.mysql /data/mariadb/

# 注意,执行这个脚本时所在的目录非常重要,必须是mysql这个目录,
# 不能是它的子目录,因为脚本中包含了相对路径。
# `--datadir`用于指定数据库文件存放目录的路径,根据实际需要来设置
$ ./scripts/mysql_install_db --datadir=/data/mariadb --user=mysql

# 输出如下表示初始化成功:
Installing MariaDB/MySQL system tables in '/data/mariadb' ...
OK
# 以下省略

如果初始化过程的输出内容出现如下警告,就需要编辑/etc/hosts文件,把主机名解析到127.0.0.1

WARNING: The host 'vm61' could not be looked up with ./bin/resolveip.
This probably means that your libc libraries are not 100 % compatible
with this binary MariaDB version. The MariaDB daemon, mysqld, should work
normally with the exception that host name resolving will not work.
This means that you should use IP addresses instead of hostnames
when specifying MariaDB privileges !

配置my.cnf

# 根据MariaDB提供的配置模板创建`/etc/my.cnf`,
# `my-small.cnf`针对MariaDB可用内存小于等于64M的机器
cp support-files/my-small.cnf /etc/my.cnf

# 在`/etc/my.cnf`的`[mysqld]`配置段添加下面两行:
# 必须:datadir = /data/mariadb
# 可选:innodb_file_per_table = on
#       1. 也可以不写` = on`,意思相同
#       2. 也可以写成`innodb-file-per-table`,意思相同
# 注意,配置文件中有多个配置段,必须添加到 [mysqld] 配置段!
sed -i -r '/\[mysqld\]/a datadir = /data/mariadb\ninnodb_file_per_table = on' /etc/my.cnf

MariaDB官方文档说,「习惯上,通过配置文件指定服务器变量使用下划线_,通过命令行指定则使用中横线-,但下划线和中横线可以互换」:

By convention, server variables have usually been specified with an underscore in the configuration files, and a dash on the command line. You can however specify underscores as dashes – they are interchangeable.

https://mariadb.com/kb/en/library/server-system-variables/#setting-server-system-variables

MariaDB自带的配置模板针对不同内存的机器,具体数值可以用grep查看:

$ grep -m1 -P 'memory|\d\d\d?M|\dGB?' support-files/my-{small,medium,large,huge,innodb-heavy-4G}.cnf
support-files/my-small.cnf:# This is for a system with little memory (<= 64M) where MySQL is only used
support-files/my-medium.cnf:# This is for a system with little memory (32M - 64M) where MariaDB plays
support-files/my-large.cnf:# This is for a large system with memory = 512M where the system runs mainly
support-files/my-huge.cnf:# This is for a large system with memory of 1G-2G where the system runs mainly
support-files/my-innodb-heavy-4G.cnf:#DESCR: 4GB RAM, InnoDB only, ACID, few connections, heavy queries

启动服务

# 把MariaDB自带的启动脚本添加到`/etc/init.d/`
cp support-files/mysql.server /etc/init.d/mysqld

# 启动MariaDB,在CentOS 6和7都可以执行
service mysqld start

# CentOS 7启动MariaDB,
# Systemd会自动把SysV启动脚本转换为service unit file
systemctl start mysqld

# 设置MariaDB开机启动,在CentOS 6和7都可以执行
chkconfig --add mysqld

至此,通过二进制包安装MariaDB-server就完成了。

配置MariaDB-server

MariaDB-server启动时开启safe-updates

开启safe-updates之后,执行UPDATEDELETE语句时,必须有WHERE子句过滤出特定的行,否则执行失败:

MariaDB [tysql]> delete from CustCopy;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

这样可以防止误删整个表的数据

启用这个选项不能通过/etc/my.cnf文件完成,如果直接在此文件的[mysqld]区域下面添加sql_safe_updates选项,MariaDB-server将无法启动。解决方法是:

  • 新建一个文件,路径和文件名不重要,这里假设是/etc/mysql_extra_init.cnf
  • /etc/mysql_extra_init.cnf文件中写入set global sql_safe_updates=1;这样一行SQL语句;
  • 编辑/etc/my.cnf文件;
  • /etc/my.cnf文件中写入init-file='/etc/mysql_extra_init.cnf';
  • 保存文件,重启MariaDB-server。

重启成功后,可以执行show global variables like 'sql_safe_updates';查看选项状态:

MariaDB [(none)]> show global variables like 'sql_safe_updates';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| sql_safe_updates | ON    |
+------------------+-------+

如果要临时禁用这个选项,执行set sql_safe_updates=0;(没有global):

MariaDB [tysql]> set sql_safe_updates=0;
Query OK, 0 rows affected (0.00 sec)

MariaDB [tysql]> show variables like 'sql_safe_updates';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| sql_safe_updates | OFF   |
+------------------+-------+

从客户端开启safe-updates

如果用户不是数据库服务器的管理员,服务器端也没有开启safe-updates,仍然可以通过客户端启用这个选项:

mysql --safe-updates

更简单方便的方法是修改配置文件/etc/my.cnf,在[mysql]配置段下面添加safe-updates

[mysql]
safe-updates

Leave A Comment