1. MySQL选型

1.1. 版本

1.1.1. 企业版与社区版

  1. MySQL的企业版和社区版区别不大,性能相差也不大,主要区别如下:
  2. 1. 企业版的开发和测试环境更加严格,稳定性更好
  3. 2. 企业版不遵守GPL开源协议,而社区版开源,可以免费使用
  4. 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