Mysql多实例数据库安装应用
1.1 MySQL多实例介绍
前文已经讲了为什么选择MySQL数据库,以及MySQL数据库在Linux系统下的多种安装方式,同时以单实例讲解了编译方式安装MySQL和基础优化等内容,本章讲更为实用的MySQL多实例安装,百度、淘宝、阿里、Sina等大公司无一例外都会使用多实例的方式部署数据库
1.1.1 什么是MySQL多实例
MySQL多实例就是在一台服务器上同时开启多个不同的服务端口(如:3306、3307),同时运行多个MySQL进程通过不同的socket监听不同的服务端口来提供服务
这些MySQL多实例公用一套MySQL安装程序,使用不同的my.cnf(也可以相通)配置文件、启动程序(也可以相同)和数据文件。在提供服务时,多实例MySQL在裸机上看来是各自独立的,他们根据配置文件的对应设定值,获得服务器相应数量的硬件资源
打个比方,MySQL多实例就相当于房子的多个卧室,每个实例就可以看作是一间卧室,真个服务器就是一套房子,服务器的应硬件资源(cpu、mem、disk)、软件资源(CentOS操作系统)可以看作是房子的卫生间、厨房、客厅,是房子的公共资源。
MySQL多实例形象示意图
其实很多网络服务都可以配置多实例,例如Nginx、Apache、Haproxy、Redis、Memcached等都可以。而且这在门户网站中使用的很广泛,当然随着虚拟化、云计算的产生和发展,也会通过不同的虚拟机切割资源配置独立的服务,但虚拟机存在一定得缺点,例如,相比于物理机,其性能会有所下降等
1.1.2 MySQL多实例的作用于问题
这一节首先来看MySQL多实例的作用,具体如下
l 可有效利用服务器资源。当但各服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务,且可以实现资源的逻辑隔离
l 节约服务器资源。若公司资金紧张,但是数据库又需要各自尽量独立的提供服务,而且,需要主从复制等技术,那么多实例就再好不过了
MySQL多实例有他自己的好处,但也有其弊端,比如,会存在资源互相抢占的问题。当某个数据库实力兵法很高或者有SQL慢查询时,整个实例会消耗大量的系统CPU磁盘I/O等资源,导致服务器上的其他数据库实例提供服务的质量一起下降,这就相当于大家住在一个房子里,每天早上都起来上班,都要洗脸刷牙等,这样卫生间就会长期处于占用状态,其他人则必须要等待。不同的实例获取资源是相对独立的,无法想虚拟化一样完全隔离
1.2 MySQL多实例的生产应用场景
1.2.1 资金紧张性公司的选择
若公司资金紧张,公司业务访问量又不太大,但又希望不同业务的数据库服务各自尽量独立的提供服务而互相不受影响,或者,还需要主从复制等技术提供备份或读写分离服务的需求,那么,多实例就再好不过了。比如:可以通过3台服务器部署9-15个实例,交叉做主从复制、数据备份及读写分离,这样就可达到9-15台服务器每个只装一个数据库才有的效果。这里要强调的是,所谓的尽量独立是相对的
1.2.2 并发访问不是特别大的业务
当公司业务访问量不太大的时候服务器的资源都是浪费的,这时就很适合多实例的应用,如果对SQL语句的优化做的比较好,MySQL多实例会是一个很值得使用的技术,即时并发很大,合理分配系统资源以及搭配着服务,也不会有太大问题
1.2.3 门户网站应用MySQL多实例场景
门户网站通常会使用多实例,因为配置硬件好的服务器,可节省IDC机柜空间,同时,跑多实例也会减少硬件资源跑不满的浪费。你如,百度公司的很多数据库都是多实例的,不过,一般是从库采取多实例,例如某部门中使用的IBM服务器为48核CPU,内存96G,一台服务器跑3-4个实例,此外,Sina网也有很多实例的,内存48G左右
说明:老男孩调查,Sina网的数据库以单击1-4个数据库市里的居多齐总又数1-2个的最多,这时因为大业务占用的机器比较多。在该公司,服务器以DELL R510居多,CPU是E5210,48G内存,磁盘12*300G SAS,采用的是RAID 10.可将此作为门户网站的服务器配置参考
另外,Sina网站安装数据库是,一般采用编译安装的方式,并且会在进行优化之后做成rpm包,以便统一使用
1.3 MySQL多实例常见的配置方案
1.3.1 单一配置文件、单一启动程序多实例部署方案
下面是MySQL官方文档提到的单一配置文件、单一启动程序多实例部署方案,不推荐使用,只作为知识点提及。my.cnf配置文件实例(MySQL手册里提到的方法)如下
[mysqld_multi]
mysqld = /usr//bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = mysql
[mysqld1]
socket = /var/lib/mysql/mysql.sock
port = 3306
pid-file = /var/lib/mysql/mysql.pid
datadir = /var/lib/mysql
user = mysql
[mysqld2]
socket = /mnt/data/db01/mysql.sock
port = 3302
pid-file = /mnt/data/db01/mysql.pid
datadir = /mnt/data/db01/
user = mysql
启动程序命令如下:
mysqld_multi --config-file=/data/mysql/my_multi.cnf start 1,2
该方案,缺点耦合度太高,只有一个配置文件,不好管理。工作开发和运维的统一原则:降低耦合度
1.3.2 多配置文件、多启动程序部署方案
多配置文件、多启动程序部署方案,是本文主要讲解的方案,也是常用的方案。
通过rz上传 第四章data-5.6-book.tar.gz ,然后解压 tar xf *data*
下面是部署好的MySQL双实例的目录信息及文件注释说明
[root@mobanji 3306]# tree -L 2 /data/
/data/
├── 3306
│ ├── data ##3306实例的数据文件
│ ├── my.cnf ###3306实例的配置文件
│ └── mysql ###3306实力的启动文件
└── 3307
├── data ###3307实例的数据文件
├── my.cnf ###3307实例的配置文件
└── mysql ##3307实力的启动文件
提示:智力的配置文件my.cnf、启动程序mysql都是独立的文件,数据文件data目录也是独立的
多实例MySQL数据库的安装和前文讲解的单实例没有问区别
1.4 安装并配置多实例MySQL数据库
1.4.1 安装MySQL多实例
1.4.1.1 安装MySQL
需要的依赖包和编译软件
1)安装MySQL需要的依赖包
安装MySQL之前,最好先安装MySQL需要的依赖包,不然后面会出现很多报错信息,
[root@lb01 tools]# yum install ncurses-devel libaio-devel -y
[root@lb01 tools]# rpm -qa ncurses-devel libaio-devel
ncurses-devel-5.7-4.20090207.el6.x86_64
libaio-devel-0.3.107-10.el6.x86_64
2)安装编译MySQL需要的软件
由于MySQL5.5及以上系列的产品要采用特殊的编译方式安装,因此,需要安装用的编译MySQL的工具cmake软件包,命令为:
[root@lb01 tools]# yum install -y cmake
[root@lb01 tools]# rpm -qa cmake
cmake-2.8.12.2-4.el6.x86_64
此外,也有网友采用源码包的方式安装cmake的,单比较复杂,所以用yum安装cmake
1.4.2 开始安装MySQL
为了让大家学习更多的MySQL技术,本文选择了相对复杂的源代码安装方式为例来讲解MySQL多实例安装,大型公司一般都会讲MySQL软件定制成rpm包,然后放到yum仓库里,使用yum安装,中小企业里的二进制和编译安装的区别不打
1)建立MySQL用户账号
首先以root身份登录到Linux系统中,然后执行如下命令创建mysql用户账号
[root@mobanji ~]# useradd -s /sbin/nologin -M mysql
[root@mobanji ~]# id mysql
uid=501(mysql) gid=501(mysql) groups=501(mysql)
根据上述结果,可以看到MySQL用户和组已经创建成功
2)获取MySQL软件包
MySQL软件包可以从http://mirrors.sohu.com/mysql下载到客户端电脑,使用rz上传的Linux里,或者找到网络下载地址后,直接在Liunx里使用wget下载
提示:本例以MySQL编译的方式来讲解,使用二进制方式安装的完整在本文结尾。在生产场景中,二进制和源码包两种安装方法都是可以用的,其应用场景一般没什么太大区别,不同之处在与二进制的安装包较大,名字和源码包也有区别,二进制的安装比源码更快
MySQL二进制和源码包
MySQL软件 |
软件名 |
MySQL源码安装包 |
mysql-5.6.34.tar.gz |
MySQL二进制安装包 |
mysql-5.6.35-linux-glibc2.5-x86_64.tar |
3)采用编译方式安装MySQL
配置及编译安装的步骤如下:
第一步,下载mysql软件包
[root@mobanji ~]# mkdir /home/oldboy/tools -p
[root@mobanji ~]# cd /home/oldboy/tools/
[root@mobanji tools]# wget -q http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.34.tar.gz
[root@mobanji tools]# ll /home/oldboy/tools/ -h
total 31M
-rw-r--r-- 1 root root 31M Sep 30 17:55 mysql-5.6.34.tar.gz
第二步,解压配置mysql,命令如下:
[root@mobanji tools]# tar xf mysql-5.6.34.tar.gz
[root@mobanji tools]# cd mysql-5.6.34
第三步:编译mysql,命令如下
[root@mobanji mysql-5.6.34]# cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.34 \
-DMYSQL_DATADIR=/application/mysql-5.6.34/data \
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.34/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \
-DWITH_SSL=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0
[root@mobanji tools]# make ###如果是多核cpu,可指定make -j cpu核数,加快编译参数
[root@mobanji tools]# make install
第四步,为MySQL安装路径设置不带版本号的软链接/application/mysql,操作命令如下
[root@mobanji tools]# ln -s /application/mysql-5.6.34/ /application/mysql
##补充:如果系统里有曾经安装的数据库文件和启动程序最好停掉或删除,以免冲突
[root@mobanji mysql-5.6.34]# ll /application/
total 4
lrwxrwxrwx 1 root root 26 Mar 15 23:17 mysql -> /application/mysql-5.6.34/
drwxr-xr-x 13 root root 4096 Mar 15 23:17 mysql-5.6.34
1.4.3 创建MySQL多实例的数据文件目录
在老男孩的企业中,通常以/data目录作为MySQL多实例总的根目录,然后规划不同的数字(即MySQL实例端口号)作为/data下面的二级目录,不同的二级目录对应,不同的二级目录对应的数字就作为MySQL是萝莉的端口号,以区别不同的实例,数字对用的二级目录下包含MySQL的数据文件、配置文件以及启动文件等
下面配置3306、3307两个实例进行讲解。创建MySQL多实例的目录如下:
[root@mobanji 3306]# make -p /data/{3306,3307}/data
/data/
├── 3306 ##3306实例的目录
│ ├── data ###3306实例的数据文件目录
└── 3307 ###3307实例的目录
├── data ###实例的数据文件目录
提示:如果是多实例,可以增加如3308、3309这样的目录名,在生产环境下以2-4个实例为佳
1.4.4 创建MySQL多实例配置文件
MySQL5.5及以下数据库默认为用户提供了多个配置文件模板,但是MySQL5.6只有一个模板文件。示例如下:
[root@mobanji 3306]# cd /home/oldboy/tools/mysql-5.6.34
[root@mobanji mysql-5.6.34]# ll support-files/*.cnf
-rw-r--r-- 1 root root 1126 Mar 15 22:59 support-files/my-default.cnf
[root@mobanji mysql-5.6.34]# mv /etc/my.cnf.bak /etc/my.cnf
注意:
在完成CentOS6.8版操作系统的最小安装后,在/etc/目录下会存在一个my.cnf,将此文件更名为其他名字,如/etc/my.cnf.bak,否则,该文件会干扰源码安装的MySQL的正确配置,造成无法启动
在启动MySQL服务时,会按照一定顺序搜索my.cnf,现在/etc/目录下找,找不到则会搜索”$basedir/my.cnf”,在本例中就是/application/mysql/my.cnf,这时新版MySQL的配置文件的默认位置
上面是单实例的默认配置文件模板,如果配置多实例,和单实例会有所不同。为了让MySQL多实例之间彼此独立,需要为每一个实例建立一个my.cnf配置文件和一个启动文件mysql,让他们分别对应自己的数据文件目录data
首先通过vim命令来添加文件欸同,命令如下:
vim /data/3306/my.cnf
vim /data/3307/my.cnf
不同的实例需要添加my.cnf内容会有区别,具体见表-2,其中的配置由官方的配置模板修改而来,当然,在实际工作中是拿早已配置好的模板来进行修改,可以通过rz等方式上传配置文件模板my.cnf文件到相关目录下
[root@mobanji mysql-5.6.34]# cat /data/3306/my.cnf
[client]
port = 3306
socket = /data/3306/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
user = mysql
port = 3306
socket = /data/3306/mysql.sock
basedir = /application/mysql
datadir = /data/3306/data
open_files_limit = 1024
back_log = 600
max_connections = 800
max_connect_errors = 3000
table_open_cache = 614
external-locking = FALSE
max_allowed_packet =8M
sort_buffer_size = 1M
join_buffer_size = 1M
thread_cache_size = 100
thread_concurrency = 2
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
#default_table_type = InnoDB
thread_stack = 192K
#transaction_isolation = READ-COMMITTED
tmp_table_size = 2M
max_heap_table_size = 2M
#long_query_time = 1
#log_long_format
#log-error = /data/3306/error.log
#log-slow-queries = /data/3306/slow.log
pid-file = /data/3306/mysql.pid
#log-bin = /data/3306/mysql-bin
relay-log = /data/3306/relay-bin
relay-log-info-file = /data/3306/relay-log.info
binlog_cache_size = 1M
max_binlog_cache_size = 1M
max_binlog_size = 2M
expire_logs_days = 7
key_buffer_size = 16M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
bulk_insert_buffer_size = 1M
lower_case_table_names = 1
skip-name-resolve
slave-skip-errors = 1032,1062
replicate-ignore-db=mysql
server-id = 6
innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:128M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 4M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
[mysqldump]
quick
max_allowed_packet = 2M
[mysqld_safe]
log-error=/data/3306/oldboy_3306.err
pid-file=/data/3306/mysqld.pid
--------------------------------------------------------------------------------------
[root@mobanji mysql-5.6.34]# cat /data/3307/my.cnf
[client]
port = 3307
socket = /data/3307/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
user = mysql
port = 3307
socket = /data/3307/mysql.sock
basedir = /application/mysql
datadir = /data/3307/data
open_files_limit = 1024
back_log = 600
max_connections = 800
max_connect_errors = 3000
table_open_cache = 614
external-locking = FALSE
max_allowed_packet =8M
sort_buffer_size = 1M
join_buffer_size = 1M
thread_cache_size = 100
thread_concurrency = 2
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
#default_table_type = InnoDB
thread_stack = 192K
#transaction_isolation = READ-COMMITTED
tmp_table_size = 2M
max_heap_table_size = 2M
#long_query_time = 1
#log_long_format
#log-error = /data/3307/error.log
#log-slow-queries = /data/3307/slow.log
pid-file = /data/3307/mysql.pid
#log-bin = /data/3307/mysql-bin
relay-log = /data/3307/relay-bin
relay-log-info-file = /data/3307/relay-log.info
binlog_cache_size = 1M
max_binlog_cache_size = 1M
max_binlog_size = 2M
expire_logs_days = 7
key_buffer_size = 16M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
bulk_insert_buffer_size = 1M
lower_case_table_names = 1
skip-name-resolve
slave-skip-errors = 1032,1062
replicate-ignore-db=mysql
server-id = 7
innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:128M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 4M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
[mysqldump]
quick
max_allowed_packet = 2M
[mysqld_safe]
log-error=/data/3307/oldboy_3307.err
pid-file=/data/3307/mysqld.pid
本文多实例的很多餐宿仅仅是方便学习环境使用,生产环境的配置可以用见本书后文,文中两个实例参数的区别已经标出
最终完成后的多实例根/data目录结果如下:
[root@mobanji mysql-5.6.34]# tree -L 2 /data/
/data/
├── 3306
│ ├── data
│ ├── my.cnf ##3306实力配置文件
│ └── mysql
└── 3307
├── data
├── my.cnf ##3307实力配置文件
└── mysql
1.4.5 创建MySQL多实例的启动文件
MySQL多实例启动文件的创建和配置几乎一样,也可以通过vim命令来添加,示例如下:
vim /data/3306/mysql
vim /data/3307/mysql
需要添加的MySQL启动文件内容见下表。实际工作中是那早已配置好的模版修改
[root@mobanji mysql-5.6.34]#vim /data/3306/mysql
#!/bin/sh
################################################
#this scripts is created by oldboy at 2007-06-09
#oldboy QQ:31333741
#site:http://www.etiantian.org
#blog:http://oldboy.blog.51cto.com
#oldboy trainning QQ group: 208160987 226199307 44246017
################################################
#init
port=3306
mysql_user="root"
mysql_pwd="oldboy123"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
start(){
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL...\n"
/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
else
printf "MySQL is running...\n"
exit 1
fi
}
stop(){
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit 1
else
printf "Stoping MySQL...\n"
${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
fi
}
restart(){
printf "Restarting MySQL...\n"
stop
sleep 2
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac
[root@mobanji mysql-5.6.34]# vim /data/3307/mysql
#!/bin/sh
################################################
#this scripts is created by oldboy at 2007-06-09
#oldboy QQ:31333741
#site:http://www.etiantian.org
#blog:http://oldboy.blog.51cto.com
#oldboy trainning QQ group: 208160987 226199307 44246017
################################################
#init
port=3307
mysql_user="root"
mysql_pwd="oldboy123"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
start(){
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL...\n"
/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
else
printf "MySQL is running...\n"
exit 1
fi
}
stop(){
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit 1
else
printf "Stoping MySQL...\n"
${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
fi
}
restart(){
printf "Restarting MySQL...\n"
stop
sleep 2
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac
最终完成的多实例根/data目录结果如下
[root@mobanji mysql-5.6.34]# tree -L 2 /data/
/data/
├── 3306
│ ├── data
│ ├── my.cnf ##3306实例配置文件
│ └── mysql ###3306实例启动文件
└── 3307
├── data
├── my.cnf ##3307实例配置文件
└── mysql ##3307实例启动文件
在很多实力启动文件中,启动MySQL不通事理服务所执行的命令实质是有区别的,例如,启动3306实例的命令如下:
mysqld_safe --defaults-file=/data/3306/my.cnf --skip-grant-tables >/dev/null 2>&1 &
启动3307实例的命令如下:
mysqld_safe --defaults-file=/data/3307/my.cnf --skip-grant-tables >/dev/null 2>&1 &
其中,--defaults-file=/data//my.cnf表示指定配置文件启动,>/dev/null 2>&1 表示将正确输出和错误输出定向到空
下面看看在所实力启动文件中,停止MySQL不同实例服务的命令
停止3306实例的命令如下:
mysqladmin -u root -poldboy123 -S /data/3306/mysql.sock shutdown
停止3307实例的命令如下:
mysqladmin -u root -poldboy123 -S /data/3307/mysql.sock shutdown
1.5 配置MySQL多示例文件权限
1)通过下面的命令授权mysql用户和组管理整个多实例的根目录/data
[root@db01 /]# chown -R mysql.mysql /data/
[root@db01 /]# find /data -name mysql|xargs ls -l
-rw-r--r-- 1 mysql mysql 1195 Feb 27 12:37 /data/3306/mysql
-rw-r--r-- 1 mysql mysql 1195 Feb 27 11:33 /data/3307/mysql
1)通过下面的命令授权mysql多实例所有实例所有启动文件的mysql可执行,设置700权限最佳,注意不要用755权限,因为启动文件里有数据库管理员密码,会被读取到
[root@db01 /]# find /data -name mysql|xargs chmod 700
现在检查上下上述命令处理结果,看是否权限处理完成
[root@db01 /]# find /data -name mysql|xargs ls -l
-rwx------ 1 mysql mysql 1195 Feb 27 12:37 /data/3306/mysql
-rwx------ 1 mysql mysql 1195 Feb 27 11:33 /data/3307/mysql
从输出看,权限已经调整完毕
1.6 MySQL相关命令加入全局路径的配置
1.6.1 配置全局路径意义
如果不为MySQL的命令配置全局路径,就无法直接在命令行输入mysql这样的命令,只能用全局路径命令(/application/mysql/bin/mysql),这种带着路径输入命令的方式很麻烦,
1.6.2 配置MySQL全局路径的方法
1)确认mysql命令所在路径
[root@db01 ~]# ls /application/mysql/bin/mysql
/application/mysql/bin/mysql
2)在PATH变量前面增加/application/mysql/bin/路径,并追加到/etc/profile文件中
[root@db01 ~]# echo 'PATH=/application/mysql/bin/:$PATH' >>/etc/profile
#注意,echo后是单引号,双引号不行。
[root@db01 ~]# tail -1 /etc/profile
PATH=/application/mysql/bin/:$PATH
[root@db01 ~]# source /etc/profile
###执行source使上一行添加到/etc/profile终,内容直接生效
###以上命令的用途为,定义mysql全局路径,实现在任意路径执行mysql路径
[root@db01 ~]# echo $PATH
/application/mysql/bin/:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
###执行echo $PATH有/application/mysql/bin输出表示配置成功
提示:
更简单的设置方法为用下面命令做软链接
ln -s /application/mysql/bin/* usr/local/sbin
把mysql命令所在路径链接到全局路径。usr/local/sbin下面
1.6.3 因MySQL环境变量配置顺序导致的错误案例
特别强调:务必把MySQL命令路径放在PATH路径中其他路径的前面,否则,可能会导致使用的mysql等命令和编译安装的mysql不是同一个,进而产生错误,下面的网站终给出了因为MySQL路径配置问题导致的错误案例
http://oldboy.blog.51cto.com/2561410/1122867,实际上就是因为yum安装的MySQL客户端命令访问了编译安装的服务端出了问题
1.6.4 初始化MySQL多实例的数据库文件
上述步骤全部配置完毕后,就可以初始化数据库文件了,这个步骤其实可以在编译安装MySQL之后就操作,
1)初始化MySQL数据库
初始化命令为:
cd /application/mysql/scripts #注意和MySQK5.1的路径不同,MySQL5.6不再MySQL bin路径下了。
./mysql_install_db --defaults-file=/data/3306/my.cnf --basedir=/application/mysql --datadir=/data/3306/data --user=mysql
./mysql_install_db --defaults-file=/data/3307/my.cnf --basedir=/application/mysql --datadir=/data/3307/data --user=mysql
实例1-1 初始化MySQL数据库时出现错误
故障1 :给出了警告信息“WARNING:The host ‘oldboy’ could not be looked up with resolveip”
警告是可以忽略的,如果非要解决则需修改对主机名的解析,使其和uname -n 命令的结果一样
[root@mobanji ~]# grep "`uname -n`" /etc/hosts
127.0.0.1 mobanji
故障2 : 错误提示ERROR:1004 Can’t create file ‘/tmp/#sql300e_1_0.frm’ (erno:13)
在执行初始化数据库命令时可能会遇到这样的错误,错误提示如下:
ERROR:1004 Can’t create file ‘/tmp/#sql300e_1_0.frm’ (erno:13)
120406 15:47:02 [ERROR] Aborting
2017-03-16 00:16:26 0 [Note] /application/mysql-5.6.34/bin/mysqld : Shutdown complete
Installation of system tables failed! Eamine the logs in
/application/mysql/data for more information
根据提示可知,/tmp目录下不能创建文件,所以解决办法为给/tmp目录增加权限,如下
解决办法:还原/tmp目录权限,操作命令如下:
[root@mobanji ~]# chmod 1777 /tmp/ ##1777时/tmp的默认权限,除非曾经改动过此目录权限才会报错
[root@mobanji ~]# ll -d /tmp/
drwxrwxrwt. 3 root root 4096 Mar 16 00:16 /tmp/
1.7 启动MySQL多实例数据库
实例3306的启命令
[root@mobanji ~]# /data/3306/mysql start
Starting MySQL...
实例3307的启动命令
[root@mobanji ~]# /data/3307/mysql start
Starting MySQL...
检查
[root@mobanji ~]# ss -lntup|grep 330
tcp LISTEN 0 80 :::3306 :::* users:(("mysqld",16273,10))
tcp LISTEN 0 600 :::3307 :::* users:(("mysqld",21908,11))
根据输出可以看到,3306和3307实例均已正常启动
1.8 MySQL多实例启动故障排错说明
如果MySQL多实例有服务没有启动,排查办法如下:
l 如果发现没有显示MySQL对应实例的端口,等几秒在检查,MySQL服务的启动比Web服务等会慢一些
l 如果还不行,查看MySQL服务对应实例的错误日志,错误日志路径在my.cnf配置的最下面定义。例如,3306实例的错误日志为:
[root@mobanji ~]# tail -2 /data/3306/my.cnf
log-error=/data/3306/oldboy_3306.err
pid-file=/data/3306/mysqld.pid
那么可以执行tail -100 /data/3306/oldboy_3306.err检查mysql错误日志
[root@mobanji ~]# tail -100 /data/3306/oldboy_3306.err
170316 15:23:31 mysqld_safe Starting mysqld daemon with databases from /data/3306/data
2017-03-16 15:23:37 0 [Warning] 'THREAD_CONCURRENCY' is deprecated and will be removed in a future release.
2017-03-16 15:23:37 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2017-03-16 15:23:37 0 [Note] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled
2017-03-16 15:23:37 0 [Note] /application/mysql-5.6.34/bin/mysqld (mysqld 5.6.34) starting as process 21185 ...
2017-03-16 15:23:38 21185 [Note] Plugin 'FEDERATED' is disabled.
2017-03-16 15:23:38 7f05510ad720 InnoDB: Warning: Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in future releases, together with the option innodb_use_sys_malloc and with the InnoDB's internal memory allocator.
l 细看所有执行命令返回的品目输出,不要忽略关键的输出内容
l 辅助查看系统日志/var/log/messages
l 如果是MySQL关联了其他服务,要同时查看相关服务的日志
l 仔细阅读操作步骤,查看操作步骤是否正确,书写是否正确
第2章 配置及管理MySQL多实例数据库
2.1 配置MySQL多实例数据库开机自启动
服务的开启自启动很关键,MySQL多实例的启动也不例外,把MySQL多实例的启动命令加入/etc/rc.local,实现开机自启动
[root@oldboy scripts]# echo "#mysql multi instances" >>/etc/rc.local
[root@oldboy scripts]# echo "/data/3306/mysql start" >>/etc/rc.local
[root@oldboy scripts]# echo "/data/3307/mysql start" >>/etc/rc.local
[root@oldboy scripts]# tail -3 /etc/rc.local
#mysql multi instances
/data/3306/mysql start
/data/3307/mysql start
提示:要确保MySQL脚本可执行,当然,也可以调整脚本,然后通过chkconfig进行开机启动管理
2.2 登录MySQL测试
测试命令如下:
[root@db01 scripts]# mysql -S /data/3306/mysql.sock
##直接敲就进来了,而且身份还是root,但是多了-S /data/3306/mysql.sock ,用于区别不同的实例
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.34 Source distribution
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
[root@db01 scripts]# mysql -S /data/3307/mysql.sock #登录3307实例
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.34 Source distribution
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
2.3 MySQL多实例数据库的管理方法
MySQL安装完成后,默认情况下,MySQL管理员的账号root使无密码的。登录不同的实例需要指定不同实例的sock路径及mysql.sock文件,这个mysql.sock是在my.cnf配置文件里指定的
下面是无密码情况下登陆数据库的方法,关键黛安是-S 参数及后面指定的
/data/3306/mysql.sock。注意,不同实例的sock虽然名字相同,但是路径是不同的,因为是不同的文件
mysql -S /data/3306/mysql.sock #停止数据库前,必须为数据库设置和/data/3306/mysql的密码变量一致的密码。
mysql -S /data/3307/mysql.sock
下面是重启对应实例数据库的命令
/data/3306/mysql stop
/data/3307/mysql stop
2.4 MySQL安全配置
MySQL管理员的账号root密码默认为空,既不安全,可以通过mysqladmin命令为mysql不同实例的数据库设置独立的密码,示例如下:
[root@db01 scripts]# mysqladmin -u root -S /data/3306/mysql.sock password 'oldboy123'
##为mysql数据库3306实例root用户设置密码oldboy123
Warning: Using a password on the command line interface can be insecure.
##这里的Warnging是5.6开始才有的,是提醒用户不傲仔命令行输入密码,后文会讲解消除的方法
[root@db01 scripts]# mysqladmin -u root -S /data/3307/mysql.sock password 'oldboy123'
##为mysql数据库3307实例root用户设置密码为oldboy123
Warning: Using a password on the command line interface can be insecure.
[root@db01 scripts]# mysql -uroot -p -S /data/3306/mysql.sock #无法直接登录了
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@db01 scripts]# mysql -uroot -p -S /data/3307/mysql.sock
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@db01 scripts]# mysql -uroot -p -S /data/3306/mysql.sock #新的登录方式
Enter password: #输入新密码oldboy123
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.34 Source distribution
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
提示:3307实例的设置方法和3306实力相同,只是链接时sock路径不同而已
下面介绍带密码登录不同实例数据库的方法
登录3306实例
mysql -uroot -poldboy123 -S /data/3306/mysql.sock
登录3307实例
mysql -uroot -poldboy123 -S /data/3307/mysql.sock
修改多实例数据库密码的命令为:
mysqladmin -uroot -S /data/3307/mysql.sock -poldboy456 password oldboy123
修改前的示例如下:
[root@db01 scripts]# sed -n '12p' /data/3306/mysql #这里登录数据库时使用的密码,是前面启动文件mysql里的默认自定义的配置。
mysql_pwd="oldboy123"
[root@db01 scripts]# sed -n '12p' /data/3307/mysql
mysql_pwd="oldboy123"
修改命令如下:
[root@db01 scripts]# sed -i '12s#oldboy123#oldboy#g' /data/3306/mysql /data/3307/mysql
#提示:也可以使用vi/vim命令编辑文件修改。
修改后的信息如下:
[root@db01 scripts]# sed -n '12p' /data/3306/mysql
mysql_pwd="oldboy"
[root@db01 scripts]# sed -n '12p' /data/3307/mysql
mysql_pwd="oldboy"
如果当前的MySQL启动文件权限为755或644,则需要降低MySQL启动文件的权限,因为有密码,被其他用户看到会很不安全。批量调整权限及属主的命令如下:
[root@db01 scripts]# find /data -type f -name "mysql" -exec chmod 700 {} \;
[root@db01 scripts]# find /data -type f -name "mysql" -exec chown root.root {} \;
[root@db01 scripts]# find /data -type f -name "mysql" -exec ls -l {} \;
-rwx------ 1 root root 1195 Feb 27 12:37 /data/3306/mysql
-rwx------ 1 root root 1195 Feb 27 11:33 /data/3307/mysql
多实例下,正常停止数据库的命令如下
/data/3306/mysql stop
#由于选择了mysqladmin shutdown的停止方式,所以停止数据库时,需要在启动文件里配置数据库的密码。
/data/3307/mysql stop
为多实例mysql设置密码:
[root@mobanji ~]# mysqladmin -uroot -p password oldboy123 -S /data/3306/mysql.sock
Enter password:
Warning: Using a password on the command line interface can be insecure.
[root@mobanji ~]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.6.34 Source distribution
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> quit
Bye
###关闭多实例mysql
[root@mobanji ~]# /data/3306/mysql stop
Stoping MySQL...
Warning: Using a password on the command line interface can be insecure.
2.5 如何再增加一个MySQL的实例?
mkdir -p /data/3308/data
\cp /data/3306/my.cnf /data/3308/
\cp /data/3306/mysql /data/3308/
sed -i 's/3306/3308/g' /data/3308/my.cnf
sed -i 's/server-id = 6/server-id = 8/g' /data/3308/my.cnf
sed -i 's/3306/3308/g' /data/3308/mysql
chown -R mysql:mysql /data/3308
chmod 700 /data/3308/mysql
cd /application/mysql/scripts
./mysql_install_db --defaults-file=/data/3308/my.cnf --datadir=/data/3308/data --basedir=/application/mysql --user=mysql
chown -R mysql:mysql /data/3308
egrep "server-id|log-bin" /data/3308/my.cnf
/data/3308/mysql start
sleep 5
netstat -lnt|grep 3308
[root@db01 scripts]# netstat -lntup|grep 330
tcp 0 0 :::3306 :::* LISTEN 24703/mysqld
tcp 0 0 :::3307 :::* LISTEN 25423/mysqld
tcp 0 0 :::3308 :::* LISTEN 26455/mysqld
如果配置好后,服务启动后却没有运行起来,一定要看日志,在/data//my.cnf最下面有错误日志路径
2.6 多实例用户MySQL登录问题解析
1)多实例本地登录MySQL
多实例本地登录一般是通过socket文件来制定具体登录到哪个实例的,此文件的具体位置是在mysql编译过程或者my.cnf里指定的。在本地登陆数据库时,登录程序会通过socket文件来判断登录到哪个数据库实例
例如:mysql -uroot -poldboy123 -S /data/3306/mysql.sock就是登录到3306这个实例
2)远程登录MySQL多实例
远程登录MySQL多实例中的一个实例时,通过TCP端口(port)来制定所要登录的MySQL实例,此端口的配置在MySQL配置文件my.cnf中指定
例如:在mysql -uoldboy -poldboy123 -h 10.0.0.7 -P 3307中,-P为端口参数,后面接具体的实力端口,端口是一种“逻辑链接位置”,时客户端程序被分派到计算机特殊服务程序的一种方式,强调的是提前在10.0.0.7上对oldboy用户做了授权
2.7 更优启动脚本
[root@db01 3306]# cat /data/3306/mysql_oldboy
#!/bin/sh
################################################
#this scripts is created by oldboy at 2007-06-09
#oldboy QQ:31333741
#site:http://www.etiantian.org
#blog:http://oldboy.blog.51cto.com
#oldboy trainning QQ group: 208160987 226199307 44246017
################################################
#init
port=3306
mysql_user="root"
mysql_pwd="oldboy123"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
mysqld_pid_file_path=/application/mysql/3306.pid
start(){
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL...\n"
/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
sleep 3
else
printf "MySQL is running...\n"
exit 1
fi
}
stop(){
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit 1
else
printf "Stoping MySQL...\n"
mysqld_pid=`cat "$mysqld_pid_file_path"`
if (kill -0 $mysqld_pid 2>/dev/null)
then
kill $mysqld_pid
sleep 2
fi
fi
}
restart(){
printf "Restarting MySQL...\n"
stop
sleep 2
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac