阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL、MariaDB安装和多实例配置

176次阅读
没有评论

共计 17681 个字符,预计需要花费 45 分钟才能阅读完成。

本文目录:
1. MySQL 单实例安装
1.1 rpm 安装 mysql
1.2 通用二进制包安装 mysql
1.2.1 初始化数据库
1.2.2 安装后的规范化操作
1.3 编译安装
1.3.1 编译安装过程
1.3.2 初始化
1.3.3 规范化
1.3.4 cmake 编译 MySQL 时的选项说明
2. mysql 多实例配置
2.1 mysql 多实例配置过程
2.2 提供 sysV 服务管理脚本
2.3 提供 systemd 服务管理脚本
3. mariadb 安装

本文介绍 mysql 各种安装方法 (rpm/glibc 通用二进制 / 源码编译) 以及多实例配置的方法,没什么技术,算是一篇方法归总文章。

  1. 本文的安装环境为 CentOS6.6 和 centos7.2,但大多数地方都以 centos6.6 作为演示示例。
  2. 本文安装 MySQL 时,它们的运行身份为 mysql,数据目录 datadir 为 /mydata/data。
  3. pid 文件路径设置为 /mydata/data/mysql.pid 或 /mydata/data/`hostname`.pid。
  4. 由于 mariadb 和 mysql 5 系列并没有太大的不同。因此仅详细展示 mysql 的安装。最后将简单提一提 mariadb。

 

1. mysql 单实例安装

 

1.1 rpm 包安装 mysql

直接 yum 安装 mysql-server 即可。但注意两点:

(1).centos7 上,yum 默认将安装 mariadb。
(2).centos6 上,yum 默认安装的版本比较老(5.1 版),要安装 mysql 5.6 或 mysql 5.7,可以从官方下载,也可以使用以下配置的 yum 源。

cat <<eof>/etc/yum.repos.d/mysql.repo
[mysql]
name=MySQL
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/\$basearch/
# baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/6/\$basearch/
# baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/7/\$basearch/
# baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/\$basearch/
enabled=1
gpgcheck=0
eof

此外,在 sohu 镜像站点也提供了 mysql 的各个 rpm 版本。地址:http://mirrors.sohu.com/mysql/

还需注意,配置了 yum 源后安装 Mysql 将使用 mysql-community-* 安装各 mysql 相关包,例如 mysql-community-server。

安装完成后,启动 mysqld。

shell> service mysqld start      # 或 systemctl start mysqld

如果启动失败,则可能需要初始化 MySQL。

shell> mkdir -p /mydata/data
shell> chown -R mysql.mysql /mydata/data
shell> mysql_install_db --datadir=/mydata/data --user=mysql

如果使用 mysql_install_db 初始化时提示该命令已经废弃(5.7 版本可能会如此提示),那么使用下面的命令进行初始化。

# 初始化时,为 root@localhost创建一个临时密码存放在 mysql.log 中
shell> mysqld --initialize --datadir=/mydata/data --user=mysql
# 初始化时,为 root@localhost创建一个空密码
shell> mysqld --initialize-insecure --datadir=/mydata/data --user=mysql

初始化后再启动,启动成功后连接数据库并修改 root@localhost 用户的密码,然后退出。

shell> mysql
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
mysql> \q

如果前面使用 mysqld --initialize 初始化数据库,那么将会为 ”root@localhost” 创建一个密码,这将使得无法直接使用 mysql 命令连接数据库。可以先从 mysql.log 中筛选出创建的临时密码,然后再手动修改为 ”123456″。

shell> grep 'temporary password' /var/log/mysqld.log
shell> mysql -uroot -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
mysql> \q

 

1.2 通用二进制包安装 mysql

通用二进制包相当于 windows 中的便携版软件,解压后稍微配置下就可以直接使用,不用安装。

mysql 通用二进制版官方下载地址:

  • MySQL 5.6 通用二进制包下载:
    https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.35-linux-glibc2.12-x86_64.tar.gz
  • MySQL 5.7 通用二进制包下载:
    https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux-glibc2.12-x86_64.tar.gz

其中文件中的 glibc2.12 表示的是 Linux 系统的 glibc 版本要比 2.12 新,可以使用 ldd --version 查看 glibc 版本。在 CentOS 6 上 glibc 默认就是 2.12 的,所以无需顾虑。

shell> tar xf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
shell> ln -s /usr/local/mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql

 

1.2.1 初始化数据库

不使用 rpm 包安装,就需要对 mysql 进行初始化以创建一些文件、库和指定一些参数。但在初始化 mysql 前,要预先做一些操作。

shell> mkdir -p /mydata/data
shell> useradd -r -s /sbin/nologin mysql
shell> chown -R mysql.mysql /usr/local/mysql
shell> chown -R mysql.mysql /mydata/data
shell> cd /usr/local/mysql
shell> scripts/mysql_install_db --datadir=/mydata/data --user=mysql
shell> chown -R root.root /usr/local/mysql

执行 mysql_install_db 时会在 /tmp 下创建临时表,所以 mysql 用户需要对 /tmp 有写权限,否则执行实例初始化脚本时可能会报类似下面的错误:
ERROR: 1 Can’t create/write to file ‘/tmp/#sql_7a0e_0.MYI’ (Errcode: 13)
这说明没有写权限,所以需要修改 /tmp 目录的权限:

chmod 1777 /tmp

同样,mysql_install_db初始时如果提示已废弃,则使用如下方法:

bin/mysqld --initialize-insecure --datadir=/mydata/data --user=mysql

初始化完成后,提供配置文件和服务启动脚本。


shell> cp -a support-files/mysql.server /etc/init.d/mysqld
shell> cp -a support-files/my-default.cnf /etc/my.cnf  

# 修改 my.cnf 的 datadir
shell> vim /etc/my.cnf 
[mysqld]
datadir=/mydata/data

如果是 centos7,则提供如下服务启动脚本(如有必要,修改 pid 文件路径)。

shell> cat /usr/lib/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

Type=forking

PIDFile=/var/run/mysqld/mysqld.pid

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Start main service
ExecStart=/usr/local/mysql-5.7.19/bin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 5000

Restart=on-failure

RestartPreventExitStatus=1

PrivateTmp=false

修改 ”root@localhost” 密码。

shell> mysql
mysql> alter user 'root'@'localhost' identified by '123456';
mysql> \q

 

1.2.2 安装后的规范化操作

编译安装或通用二进制安装后,一般都需要做一些额外的操作,包括设置环境变量、输出头文件和库文件、设置 man 路径。

echo "export PATH=/usr/local/mysql/bin:$PATH" >/etc/profile.d/mysql.sh
chmod +x /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
echo "MANPATH /usr/local/mysql/man" >>/etc/man.config

echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf
ldconfig
ln -s /usr/local/mysql/include /usr/include/mysql

 

1.3 编译源码安装 mysql

建议别没事找事,尝试编译装 MySQL,完全是吃力不讨好的事。如果确实要编译安装,把 my.cnf、服务管理脚本、编译选项等涉及到运行文件路径的项确保相同,例如 pid 文件、socket 文件、datadir 路径、log 文件。并保证 mysql 涉及到的目录所有者和所属组都是 mysql,例如默认的 pid 路径 /var/run/mysql/。

mysql 源码包下载地址:

  • MySQL 5.6 源码包下载:
    https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.37.tar.gz
  • MySQL 5.7 源码包下载:
    https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19.tar.gz

 

1.3.1 编译安装过程

关于编译选项,见下文。

使用以下命令安装 mysql 5.6。

yum -y install ncurses-devel cmake
tar xf ~/mysql-5.6.37.tar.gz
cd ~/mysql-5.6.37
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.6.37 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_FAST_MUTEXES=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DWITH_SSL=bundled \
-DWITH_DEBUG=0 
make
make install

使用以下命令安装 mysql 5.7。比上述多了最后一个 boost 相关设置项,不设置此项可能会 cmake 失败。

yum -y install ncurses-devel cmake
tar xf ~/mysql-5.7.19.tar.gz
cd ~/mysql-5.7.19
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.19 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_FAST_MUTEXES=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DWITH_SSL=bundled \
-DWITH_DEBUG=0 \
-DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost
make
make install

如果是 centos7,则加上一项-DWITH_SYSTEMD=1,这会提供 systemd 脚本。

注意,上述编译选项中没有提供 sysconfdir、datadir、pidfile 和 socket 等 mysql 运行时文件类设置选项。虽然可以设置,但没必要,而且在做多实例的时候可能会出现问题。不过,可以考虑加上 MYSQL_UNIX_ADDR 项来设置 socket 路径,因为不设置的话其会采用默认的 /tmp/mysql.sock。

 

1.3.2 初始化

shell> ln -s /usr/local/mysql-5.6.37 /usr/local/mysql
shell> cd /usr/local/mysql
shell> useradd -r -s /sbin/nologin mysql
shell> mkdir -p /mydata/data
shell> chown -R mysql.mysql /mydata/data
shell> chmod o-rx /mydata/data
shell> chown -R mysql.mysql /usr/local/mysql
shell> scripts/mysql_install_db --user=mysql --datadir=/mydata/data
shell> cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
shell> cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
shell> chown -R root.root /usr/local/mysql
# 修改 my.cnf 的 datadir、socket、log 和 pid 路径。
shell> vim /etc/my.cnf 
[mysqld]
datadir=/mydata/data
socket=/tmp/mysql.sock
[mysqld_safe]
log-error=/mydata/data/mysql.log
pid-file=/mydata/data/mysqld.pid

注:mysql 5.7 建议采用如下语句进行初始化。

/usr/local/mysql/bin/mysqld --initialize-insecure --datadir=/mydata/data --user=mysql

如果是 centos7,则提供 systemd 风格的 服务管理脚本,并确认是否要修改 pid 文件路径。

 

1.3.3 规范化

输出头文件、库文件,设置 PATH 环境变量,设置 man 路径。

echo "export PATH=/usr/local/mysql/bin:$PATH" >/etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
chmod +x /etc/profile.d/mysql.sh
echo "MANPATH /usr/local/mysql/man" >>/etc/man.config
echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf
ldconfig
ln -s /usr/local/mysql/include /usr/include/mysql

 

1.3.4 cmake 编译 MySQL 时的选项说明

Installation Layout Options

  • -DCMAKE_INSTALL_PREFIX=dir_name # MySQL 的安装位置
  • -DINSTALL_PLUGINDIR=dir_name  # 插件安装的目录
  • -DMYSQL_DATADIR=dir_name  # MySQL 的 data dir
  • -DSYSCONFDIR=dir_name # MySQL 默认的配置文件 (my.cnf) 路径
  • -DTMPDIR=dir_name # 临时文件存放路径,在 MySQL5.6.16 中才开始提供该选项

Storage Engine Options

存储引擎是插件式的,可被静态编译到 MySQL 服务中,也可以动态编译成模块,编译成模块时需要使用 INSTALL PLUGIN 语句或者 --plugin-load 选项来启用。但某些插件是固化的,无法指定是静态编译还是动态编译。

InnoDB,MyISAM,MERGE,MEMORY 和 CSV 存储引擎总是默认静态编译到 MySQL 服务中的,在编译安装的时候无需显式指定它们。

编译存储引擎的时候,使用 -DWITH_enginename_STORAGE_ENGINE=1 表示静态编译到 MySQL。可选的引擎有:ARCHIVE、BLACKHOLE、EXAMPLE、FEDERATED、PARTITION(分区支持引擎)、PERFSCHEMA(Performance Schema)。如:

-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1

使用 -WITHOUT_enginename_STORAGE_ENGINE=1 表示显式的排除这些引擎,即强制不使用它们。如:

-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1
-DWITHOUT_PARTITION_STORAGE_ENGINE=1

-DWITH_enginename_STORAGE_ENGINE-WITHOUT_enginename_STORAGE_ENGINE 都没有指定某些引擎的话,这些引擎默认动态编译成模块,如果无法动态编译成模块则不编译。

Feature Options

  • -DDEFAULT_CHARSET=charset_name

设置默认字符集,默认为 latin1。例如,binary,ascii,big5 ,gb2312,gbk,latin1,latin2,latin5,latin7,utf8。

在 cmake/character_sets.cmake 文件中的 CHARSETS_AVAILABLE 定义了允许使用的字符集列表。

字符集的设置可以在 MySQL 服务启动的时候使用 ”–character_set_server” 选项来指定。

  • -DDEFAULT_COLLATION=collation_name

设置默认的排序规则。默认排序规则为 latin1_swedish_ci。使用 SHOW COLLATION 语句可以查看每种字符集可以使用的排序规则。

排序规则的设置可以在 MySQL 服务启动的时候使用 --collation_server 选项来指定。

  • -DENABLED_LOCAL_INFILE=bool

Whether to enable LOCAL capability in the client library for LOAD DATA INFILE.
This option controls client-side LOCAL capability, but the capability can be set on the server side at server startup with the –local-infile option.

  • -DMYSQL_TCP_PORT=port_num

指定 MySQL 的 TCP 端口,默认是 3306。可以在启动服务时使用 –port 选项指定。

  • -DMYSQL_UNIX_ADDR=file_name

指定 MySQL 的套接字路径,必须是绝对路径,默认是 /tmp/mysql.sock。可以在启动服务时使用 –port 选项指定。

  • -DWITH_EXTRA_CHARSETS=name
    Which extra character sets to include:

    • all: All character sets. This is the default.
    • complex: Complex character sets.
    • none: No extra character sets.
  • -DWITH_INNODB_MEMCACHED=bool

Whether to generate memcached shared libraries (libmemcached.so and innodb_engine.so).

  • -DWITH_SSL={ssl_type|path_name}
    The type of SSL support to include (if any) or the path name to the OpenSSL installation to use.

    • ssl_type can be one of the following values:
      • no: No SSL support. This is the default before MySQL 5.6.6. As of 5.6.6, this is no longer a permitted value and the default is bundled.
      • yes: Use the system SSL library if present, else the library bundled with the distribution.
      • bundled: Use the SSL library bundled with the distribution. This is the default as of MySQL 5.6.6.
      • system: Use the system SSL library.
    • path_name, permitted for MySQL 5.6.7 and after, is the path name to the OpenSSL installation to use. Using this can be preferable to using the ssl_type value of system, for it can prevent CMake from detecting and using an older or incorrect OpenSSL version installed on the system. (Another permitted way to do the same thing is to set the CMAKE_PREFIX_PATH option to path_name.).
  • -DWITH_ZLIB=zlib_type

    • bundled: Use thezliblibrary bundled with the distribution. This is the default.
    • system: Use the system zlib library.

 

2. mysql 多实例配置

mysql 可以实现多实例,但因为多实例会共用服务器资源,导致资源争用,在某实例某一刻资源占用很多时(高并发、慢查询),其他的实例会受到影响。

无论是 rpm 安装、通用二进制安装还是编译安装,都有两种方法实现多实例。

  1. 共用配置文件
    在 my.cnf 中配置多个 ”[mysqldN]”,N 是一个数字,表示 MySQL 服务。
    启停的时候使用 mysqld_multi {start|stop|restart} N。N 可以是单个数字,也可以是逗号分隔的多个数字,还可以是短横线表示的范围数字。如果不是 rpm 包安装的,则mysqld_multi 文件的路径在 support-files 中,将其 copy 到 /etc/init.d 下即可(没有原生态的 systemd 多实例服务管理脚本)。
    mysqld_multi start 1,2,4-6
    
  2. 单独的配置文件和启动程序(推荐)
    MySQL 只需安装一次,即不同实例使用同一安装程序。但每个实例使用单独的配置文件、服务管理脚本、datadir 目录和 socket,并且启停 mysqld 服务时需要指定套接字文件。

 

2.1 mysql 多实例配置过程

本文介绍第二种方法,并采用 rpm 包安装的 mysql 实现多实例。再次说明,无论使用何种方式安装 mysql,都可以实现多实例,其实看明白下面配置的过程就知道了。

创建并设置 datadir,并初始化、分别提供配置文件。

shell> mkdir -p /mydata/{3306,3307}/data
shell> chown -R mysql.mysql /mydata/{3306,3307}/data
shell> mysql_install_db --datadir=/mydata/3306/data --user=mysql
shell> mysql_install_db --datadir=/mydata/3307/data --user=mysql
shell> cp /etc/my.cnf /mydata/3306/my.cnf
shell> cp /etc/my.cnf /mydata/3307/my.cnf

如果是设置 mysql 5.7 的多实���,则初始化时使用如下命令替换上面的mysql_install_db

shell> mysqld --initialize-insecure --datadir=/mydata/3306/data --user=mysql
shell> mysqld --initialize-insecure --datadir=/mydata/3307/data --user=mysql

分别修改两个配置文件。

# 以下是 3306 实例的配置文件要修改的部分。
shell> vim /mydata/3306/my.cnf
[mysqld]
port=3306
datadir=/mydata/3306/data
socket=/mydata/3306/data/mysql.sock
server_id=1
[mysqld_safe]
log-error=/mydata/3306/data/mysqld.log
pid-file=/mydata/3306/data/mysqld.pid

# 以下是 3307 实例的配置文件要修改部分。
shell> vim /mydata/3307/my.cnf
[mysqld]
port=3307
datadir=/mydata/3307/data
socket=/mydata/3307/data/mysql.sock
server_id=2
[mysqld_safe]
log-error=/mydata/3307/data/mysqld.log
pid-file=/mydata/3307/data/mysqld.pid

 

2.2 提供 sysV 服务管理脚本

再分别提供服务管理脚本。

  • 以下是 3306 实例的管理脚本 /etc/init.d/mysqld3306,内容修改自原有管理脚本 /etc/init.d/mysqld。
  • 由于我的示例中 mysql 是采用 rpm 安装,所以 mysql 的 basedir 为 /usr,如果是编译安装或通用二进制安装,则对应修改下面脚本中的 basedir 变量。
  • 下面的 datadir 变量设置为 /mydata/$port/data。请务必和上面的初始化设置和配置文件中设置的相同。
  • 将此管理脚本复制为 /etc/init.d/mysqld3307,再修改下 port=3307 即可作为 3307 实例的服务管理脚本。
  • 此脚本不会初始化 mysql(我把这部分代码删了)创建实例,所以启动服务前务必先初始化好对应的 mysql 实例。
  • 下面的脚本即可作为多实例服务管理脚本,也可以作为单实例服务管理脚本,只需将脚本名称改一改即可。
#!/bin/sh
#
# mysqld    This shell script takes care of starting and stopping
#        the MySQL subsystem (mysqld).
#
# chkconfig: 345 64 36
# description:    MySQL database server.
# processname: mysqld

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

basedir=/usr
exec="$basedir/bin/mysqld_safe"
prog="mysqld"
port=3306
datadir="/mydata/$port/data"
socketfile="$datadir/mysql.sock"
errlogfile="$datadir/mysqld.log"
mypidfile="$datadir/mysqld.pid"
cnf="/mydata/$port/my.cnf"

# Set timeouts here so they can be overridden from /etc/sysconfig/mysqld
STARTTIMEOUT=120
STOPTIMEOUT=60

# Set in /etc/sysconfig/mysqld, will be passed to mysqld_safe
MYSQLD_OPTS=

[-e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

lockfile=/var/lock/subsys/$prog

case $socketfile in
    /*) adminsocket="$socketfile" ;;
     *) adminsocket="$datadir/$socketfile" ;;
esac

start(){[ -x $exec ] || exit 5
    # check to see if it's already running
    RESPONSE=$(/usr/bin/mysqladmin --no-defaults --socket="$adminsocket" --user=UNKNOWN_MYSQL_USER ping 2>&1)
    if [$? = 0 ]; then
    # already running, do nothing
    action $"Starting $prog:" /bin/true
    ret=0
    elif echo "$RESPONSE" | grep -q "Access denied for user"
    then
    # already running, do nothing
    action $"Starting $prog:" /bin/true
    ret=0
    else
    # Now start service
    $exec $MYSQLD_OPTS --defaults-file="$cnf" --datadir="$datadir" --socket="$socketfile" \
        --pid-file="$mypidfile" \
        --basedir="$basedir" --user=mysql >/dev/null &
    safe_pid=$!
    # Spin for a maximum of N seconds waiting for the server to come up;
    # exit the loop immediately if mysqld_safe process disappears.
    # Rather than assuming we know a valid username, accept an "access
    # denied" response as meaning the server is functioning.
    ret=0
    TIMEOUT="$STARTTIMEOUT"
    while [$TIMEOUT -gt 0 ]; do
        RESPONSE=$(/usr/bin/mysqladmin --no-defaults --socket="$adminsocket" --user=UNKNOWN_MYSQL_USER ping 2>&1) && break
        echo "$RESPONSE" | grep -q "Access denied for user" && break
        if ! /bin/kill -0 $safe_pid 2>/dev/null; then
        echo "MySQL Daemon failed to start."
        ret=1
        break
        fi
        sleep 1
        let TIMEOUT=${TIMEOUT}-1
    done
    if [$TIMEOUT -eq 0 ]; then
        echo "Timeout error occurred trying to start MySQL Daemon."
        ret=1
    fi
    if [$ret -eq 0 ]; then
        action $"Starting $prog:" /bin/true
        touch $lockfile
    else
        action $"Starting $prog:" /bin/false
    fi
    fi
    return $ret
}

stop(){if [! -f "$mypidfile" ]; then
        # not running; per LSB standards this is "ok"
        action $"Stopping $prog:" /bin/true
        return 0
    fi
    MYSQLPID=`cat "$mypidfile"`
    if [-n "$MYSQLPID" ]; then
        /bin/kill "$MYSQLPID" >/dev/null 2>&1
        ret=$?
        if [$ret -eq 0 ]; then
        TIMEOUT="$STOPTIMEOUT"
        while [$TIMEOUT -gt 0 ]; do
            /bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
            sleep 1
            let TIMEOUT=${TIMEOUT}-1
        done
        if [$TIMEOUT -eq 0 ]; then
            echo "Timeout error occurred trying to stop MySQL Daemon."
            ret=1
            action $"Stopping $prog:" /bin/false
        else
            rm -f $lockfile
            rm -f "$socketfile"
            action $"Stopping $prog:" /bin/true
        fi
        else
        action $"Stopping $prog:" /bin/false
        fi
    else
        # failed to read pidfile, probably insufficient permissions
        action $"Stopping $prog:" /bin/false
        ret=4
    fi
    return $ret
}

restart(){
    stop
    start
}

condrestart(){[ -e $lockfile ] && restart || :
}


# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status -p "$mypidfile" $prog
    ;;
  restart)
    restart
    ;;
  condrestart|try-restart)
    condrestart
    ;;
  reload)
    exit 3
    ;;
  force-reload)
    restart
    ;;
  *)
    echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
    exit 2
esac

exit $?

使用下面的命令管理两个实例:

service mysqld3306 {start|stop|status|restart}
service mysqld3307 {start|stop|status|restart}

第一次启动可能会失败,也可能会警告和 log 相关的项,这是正常的,之后都会正常。

 

2.3 提供 systemd 服务管理脚本

  • 以下是 3306 实例的管理脚本 /usr/lib/systemd/system/mysqld3306.service。
  • 由于我的示例中 mysql 是采用 rpm 安装,所以 mysql 的 basedir 为 /usr,如果是编译安装或通用二进制安装,则对应修改下面脚本中的 basedir 变量。
  • 由于 rpm 包安装在 centos 7 上,已经没有 mysqld_safe 命令,因此使用 mysqld 来启动 mysql 实例。
  • 将此管理脚本复制为 /usr/lib/systemd/system/mysqld3307.service,再将其内的 3306 修改为 3307 即可作为 3307 实例的服务管理脚本。
  • 此脚本不会初始化 mysql(我把这部分代码删了)创建实例,所以启动服务前务必先初始化好对应的 mysql 实例。
  • 下面的脚本即可作为多实例服务管理脚本,也可以作为单实例服务管理脚本,只需将脚本名称改一改即可。
  • mysql 为 systemd 自带了多实例服务管理脚本 /usr/lib/systemd/system/mysqld@.service。我没有采用,但其设置方法可以借鉴下。
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

Type=forking

PIDFile=/mydata/3306/data/mysqld.pid

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Execute pre and post scripts as root
PermissionsStartOnly=true

# Start main service
ExecStart=/usr/sbin/mysqld --defaults-file=/mydata/3306/my.cnf --basedir=/usr --daemonize $MYSQLD_OPTS
# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 5000

Restart=on-failure

RestartPreventExitStatus=1

PrivateTmp=false

然后重载下 systemd 服务管理脚本。

systemctl daemon-reload

之后就可以使用下面的命令管理两个实例:

systemctl {start|stop|status|restart} mysqld3306
systemctl {start|stop|status|restart} mysqld3307

 

3. mariadb 安装

mariadb 基本上算是 mysql 的另一个实现,绝大多数以及基础功能上和 MySQL 都相同。具体到安装上,也基本完全一样。

在 centos7 上,直接 yum install mysql-server 将默认安装 mariadb,如果配置了 mysql 的 yum 源,需要指定 ”mysql-community-server” 才表示安装 mysql。

以下仅提供 mariadb 的各项资源下载地址,具体安装方法见前文对应 mysql 安装方法。个人建议,将 mariadb 的服务启动脚本阅读一遍,和 MySQL 的做个比较。

mariadb 的镜像站点:

[mariadb]
name=mariadb
baseurl=http://yum.mariadb.org/10.2.6/centos/6.6/$basearch/
#baseurl=http://yum.mariadb.org/10.2.6/centos/7.2/$basearch/
enabled=1
gpgcheck=0

mariadb 各通用二进制版:

mariadb 各种二进制版本:https://downloads.mariadb.org/mariadb/+releases/

mariadb 10.2.6 systemd 版(centos7):http://ftp.hosteurope.de/mirror/archive.mariadb.org//mariadb-10.2.6/bintar-linux-systemd-x86_64/mariadb-10.2.6-linux-systemd-x86_64.tar.gz

mariadb 10.2.6 非 systemd 版(centos6):http://ftp.hosteurope.de/mirror/archive.mariadb.org//mariadb-10.2.6/bintar-linux-x86_64/mariadb-10.2.6-linux-x86_64.tar.gz

mariadb 源码包:http://ftp.hosteurope.de/mirror/archive.mariadb.org//mariadb-10.2.6/source/mariadb-10.2.6.tar.gz

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/147402.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计17681字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中