1. MySQL选型
1.1. 版本
1.1.1. 企业版与社区版
MySQL的企业版和社区版区别不大,性能相差也不大,主要区别如下:
1. 企业版的开发和测试环境更加严格,稳定性更好
2. 企业版不遵守GPL开源协议,而社区版开源,可以免费使用
3. 企业版可以购买技术支持服务,包括7×24小时的技术支持,及时的补丁升级等服务。而社区版的服务质量与时效性较差。
1.1.2. 四种发行版
Alpha 版本:开发版本,非常不稳定。
Beta 版本:公测版本,基本不存在特别大的BUG,邀请或提供给用户进行体验和测试的版本。
RC 版本:根据Beta版本收集的意见和BUG进行修补,在稳定版之前发布的一个小版本。
GA 版本:正式版,也就是常说的稳定版。
1.1.3. 版本号
以mysql-5.6.40.tar.gz为例:
第一个数字5:主版本号
第二个数字6: 发行级别,与主版本号构成了发行级别。
第三个数字40: 在当前发行级别上的版本号。
后缀: 根据发行版的类型不同,可能存在alpha,beta,rc等后缀,GA版本没有后缀
1.2. 产品线
1. MySQL-5.0.xx--MySQL-5.1.xx
MySQL-5.0.xx升级到MySQL-5.1.xx,MySQL-5.1是当前的产品线的稳定版,只针对漏洞修复进行发布,不再发布新的功能。
本产品线已经发展到了MySQL-5.2 非稳定版本。
2. MySQL-5.4.xx--MySQL-5.7.xx
为了整合新的存储引擎、提高性能,从MySQL-5.4开始,做了大量的代码重构。当前的稳定版本已经到了MySQL-5.7。
当前产品线已经发展到 MySQL-6.0和MySQL-8.0的非稳定版。
当前的主流是MySQL-5.6,MySQL-5.7是未来的主流,华为消费者业务使用的就是MySQL-5.6版本。
3. MySQL-Cluster-6.0.xx--MySQL-Cluster-7.5.xx
为了推广MySQL-Cluster,推出了MySQL Cluster产品线。
1.3. 选型
数据库选型是非常重要的,尤其是在大公司高并发的业务场景下,一般遵守以下的思路:
1. 选择稳定版(GA),一般当前互联网公司主流选择MySQL-5.5和MySQL-5.6版本
2. 选择发布半年以上,且前后几个月没有大量BUG修复的版本
3. 考虑当前开发的应用程序兼容性问题
4. 从内部测试环境开始,逐步过渡到生产中的边缘业务,再逐步到核心业务切换
5. 同行交流,选择大公司或者高手推荐的GA版本
2. MySQL安装
2.1. MySQL安装方式
1. 使用RMP包方式安装
这里存在两种方式,一种是使用rpm命令直接安装指定版本的数据库,另一种是使用yum源安装。
在生产实践中,如果不需要对MySQL进行个性化的编译,可以使用rpm方式安装,华为消费者业务就是使用rpm包方式安装。
CentOS自带的yum中MySQL版本偏低,一般不采用,可以使用官方提供的yum仓库。
2. 编译安装
如果对MySQL本身需要进行定制化,则采用编译安装。编译安装根据不同的产品线,存在两种编译安装方式:
(1) configure
对于第一条产品线,会采用 ./configure ; make ;make install 的方式安装。对于5.4以后的版本不适用
(2) cmake
对于5.4及以后的产品线,使用cmake或者gmake方式编译安装,./cmake ; make ; make install
3. 二进制方式安装
将编译安装好的二进制包直接拿来使用,这种方式在生产中也非常常见,避免了繁琐的安装和配置过程。
2.2. 源码编译安装单实例
2.2.1. 安装
# 机器操作系统: CentOS 6.10
1. 准备工作
[root@MySQL-1-190 ~]# yum install -y ncurses-devel libaio-devel cmake wget autoconf gcc gcc-c++
[root@MySQL-1-190 ~]# useradd -s /sbin/nologin -M -u 3306 mysql
[root@MySQL-1-190 ~]# id mysql
uid=3306(mysql) gid=3306(mysql) groups=3306(mysql)
[root@MySQL-1-190 ~]# mkdir -p /opt/apps/software && cd /opt/apps/software
2. 安装
[root@MySQL-1-190 software]# wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.42.tar.gz
[root@MySQL-1-190 software]# tar -xf mysql-5.6.42.tar.gz
[root@MySQL-1-190 software]# cd mysql-5.6.42
# 编译参数参考官方文档
[root@MySQL-1-190 mysql-5.6.42]# cmake . -DCMAKE_INSTALL_PREFIX=/opt/apps/release/mysql-5.6.42 \
-DMYSQL_DATADIR=/opt/apps/release/mysql-5.6.42/data/ \
-DMYSQL_UNIX_ADDR=/opt/apps/release/mysql-5.6.42/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \
-DWITH_SSL=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0
[root@MySQL-1-190 mysql-5.6.42]# make -j 4 && make install
3. 规范路径
[root@MySQL-1-190 mysql-5.6.42]# ln -s /opt/apps/release/mysql-5.6.42/ /opt/apps/mysql
[root@MySQL-1-190 mysql-5.6.42]# chown -R mysql.mysql /opt/apps/mysql
[root@MySQL-1-190 ~]# ln -s /opt/apps/mysql/bin/mysql /usr/local/bin/
[root@MySQL-1-190 ~]# cp /opt/apps/mysql/support-files/my-default.cnf /etc/my.cnf # MySQL启动时会优先检索/etc/my.cnf
2.2.2. 初始化
1. 初始化
[root@MySQL-1-190 ~]# /opt/apps/mysql/scripts/mysql_install_db \
--basedir=/opt/apps/mysql/ --datadir=/opt/apps/release/mysql-5.6.42/data/ --user=mysql
user=mysql
...
OK
...
OK
...
You can start the MySQL daemon with:
cd . ; /opt/apps/mysql//bin/mysqld_safe &
......
WARNING: Default config file /etc/my.cnf exists on the system
This file will be read by default by the MySQL server
If you do not want to use this, either remove it, or use the
--defaults-file argument to mysqld_safe when starting the server
2. 拷贝启动脚本
[root@MySQL-1-190 ~]# cp /opt/apps/mysql/support-files/mysql.server /etc/init.d/
[root@MySQL-1-190 ~]# chmod 700 /etc/init.d/mysql.server
3. 启动报错,提示缺少socket的父目录tmp
[root@MySQL-1-190 ~]# /etc/init.d/mysql.server start
Starting MySQL.Logging to '/opt/apps/release/mysql-5.6.42/data/MySQL-1-190.err'.
181124 09:32:18 mysqld_safe Directory '/opt/apps/release/mysql-5.6.42/tmp' for UNIX socket file don't exists.
ERROR! The server quit without updating PID file (/opt/apps/release/mysql-5.6.42/data/MySQL-1-190.pid).
4. 创建socket父目录并重启
[root@MySQL-1-190 ~]# mkdir /opt/apps/release/mysql-5.6.42/tmp && chown mysql.mysql /opt/apps/release/mysql-5.6.42/tmp
[root@MySQL-1-190 ~]# /etc/init.d/mysql.server start
Starting MySQL.Logging to '/opt/apps/release/mysql-5.6.42/data/MySQL-1-190.err'.
.. SUCCESS!
[root@MySQL-1-190 ~]# netstat -lntp | grep 3306
tcp 0 0 :::3306 :::* LISTEN 1695/mysqld