MySQL多实例安装
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL多实例安装相关的知识,希望对你有一定的参考价值。
mysql数据库(一) |
作者:Jack 归档:学习笔记 2017/6/19
|
目 录
2.1.3 对网站来说,关系型数据库的很多特性不再需要了:... 10
4.1 单一配置文件、单一启动程序的多实例部署方案... 17
5.1.1 安装MySQL需要的依赖包和编译软件... 19
5.1.6 MySQL相关命令加入全局路径的配置... 32
MySQl数据库(一)
第1章 概述:
1.1 MySQL介绍:
以前已经介绍过,MySQL属于传统关系型数据库产品,它开放式的架构使得用户选择性很强,同时社区开发与维护人数众多。其功能稳定,性能卓越,且在遵守GPL协议的前提下,可以免费使用与修改,也为MySQL的推广与使用带来了更多的利好。在MySQL成长与发展过程中,支持的功能逐渐增多,性能也不断提高,对平台的支持也越来越多。
MySQL是一种关系型数据库管理系统,关系型数据库的特点是将数据保存在不同的表中,再将这些表放入不同的数据库中,而不是将所有数据统一放在一个大仓库里,这样的设计增加了MySQL的读取速度,而且灵活性和可管理性也得到了很大提高。访问及管理MySQL数据库的最常用标准化语言为SQL结构化查询语言。
1.2 MariaDB数据库的诞生背景介绍
自甲骨文公司收购MySQL后,其在商业数据库与开源数据库领域市场的占有份额都跃居第一,这样的格局引起了业内很多的人士的担忧,因为商业数据库的老大有可能将MySQL闭源。为了避免Oracle将MySQL闭源,而无开源的类MySQL数据库可用,MySQL社区采用分支的方式来避开这个风险。MariaDB数据库就这样诞生了,MariaDB是一个向后兼容,可能在以后替代MySQL的数据库产品,其官方地址为https://mariadb.org/。不过,这里还是建议大家选择更稳定、使用更广泛的MySQL数据库,可以先测试MariaDB数据库,等使用的人员更多一些,社区更活跃后再考虑使用为好。
1.3 MySQL多实例介绍
在以前,已经针对MySQL数据库进行了介绍,并说明了为什么要选择MySQL数据库,以及MySQL数据库在Linux系统下的多种安装方式,同时讲解了MySQL的二进制方式单实例安装、基础优化等内容,今天将为大家讲解更为实用的MySQL多实例安装、主从复制集群等重要应用实践。
1.3.1 什么是MySQL多实例
简单地说,MySQL多实例就是在一台服务器上同时开启多个不同的服务器端口(如:3306、3307),同时运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务器端口来提供服务。
这些MySQL多实例共用一套MySQL安装程序,使用不同的my.cnf(也可以相同)配置文件、启动程序(也可以相同)和数据文件。在提供服务时,多实例MySQL在逻辑上看起来是各自独立的,它们根据配置文件的对应设定值,获得服务器相应数量的硬件资源。
打个比方吧,MySQL多实例就相当于房子的多个卧室,每个实例可以看作一间卧室,整个服务器就是一套房子,服务器的硬件资源(CPU、Mem、Disk)、软件资源(Centos操作系统)可以看作房子的卫生间、厨房、客厅,是房子的公用资源。若你是北漂的小伙伴,与朋友一起租房,相信对此能更好地理解。大家蜗居在一起,在自己的卧室休息,出来活动时肯定是要共用上述公共资源的。这样该明白MySQL多实例了吧。
其实很多网络服务都是可以配置多实例的,例如nginx、Apache、Haproxy、Redis、Memcahe等。这在门户网站使用得很广泛。
1.3.2 MySQL多实例的作用与问题
MySQL多实例的作用,具体如下。
有效利用服务器资源
当单个服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务,且可以实现资源的逻辑隔离。
节约服务器资源
当公司资金紧张,但是数据库又需要各自尽量独立地提供服务,而且,需要主从复制等技术时,多实例就再好不过了。
MySQL多实例有它的好处,但也有其弊端,比如,会存在资源互相抢占的问题。
当某个数据库实例并发很高或有SQL慢查询时,整个实例会消耗大量的系统CPU、磁盘I/O等资源,导致服务器上的其他数据库实例提供服务的质量一起下降。这就相当于大家住在一个房子的不同卧室一样,早晨起来上班,都要刷牙、洗脸等,这样卫生间就会长期占用,其他人要等待一样。不同实例获取的资源是相对独立的,无法像虚拟化一样完全隔离。
1.4 MySQL多实例的生产应用场景
资金紧张型公司的选择:
若公司资金紧张,公司业务访问量不太大,但又希望不同业务的数据库服务各自尽量独立地提供服务而互相不受影响,同时,还需要主从复制等技术提供备份或读写分离服务,那么,多实例就再好不过了。例如:可以通过3台服务器部署9~15个实例,交叉做主从复制、数据备份及读写分离,这样就可达到9~15台服务器每个只装一个数据库才有的效果。这里要强调的是,所谓的尽量独立是相对的。
并发访问不是特别大的业务
当公司业务访问量不太大的时候,服务器的资源基本上都浪费了,这时就很适合多实例的应用,如果对SQL语句的优化做得比较好,MySQL多实例会是一个很值得使用的技术,即使并发很大,合理分配好系统资源,搭配好服务,也不会有太大问题。
门户网站应用MySQL多实例场景
门户网站通常都会使用多实例,因为配置硬件好的服务器,可节省IDC机柜空间,同时,跑多实例也会减少硬件资源跑不满的浪费。比如,百度公司的很多数据库都是多实例,不过,一般是从库多实例,例如某部门中使用的IBM服务器为48核CPU,内存96GB,一台服务器跑3~4个实例;此外,新浪网使用的也是多实例,内存48GB左右。
说明:
据老男孩调查,新浪网的数据库单机1~4个数据库实例的居多,其中又数1~2个的最多,因为大业务占用的机器比较多。服务器是DELL R510的居多,CPU是E5210,48GB内存,磁盘12×300G SAS,做RAID10,此为门户网站的服务器配置参考,希望能给读者购买服务器及部署实例一点数据帮助。
另外,新浪网站安装数据库时,一般采用编译安装的方式,并且会在优化之后做成rpm包,以便统一使用。
第2章 关系型数据库与非关系型数据库
2.1 关系型数据库
关系型数据库,是指采用了关系模型来组织数据的数据库。
关系模型是在1970年由IBM的研究员E.F.Codd博士首先提出的,在之后的几十年中,关系模型的概念得到了充分的发展并逐渐成为主流数据库结构的主流模型。
简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
关系模型中常用的概念:
关系:可以理解为一张二维表,每个关系都具有一个关系名,就是通常说的表名
元组:可以理解为二维表中的一行,在数据库中经常被称为记录
属性:可以理解为二维表中的一列,在数据库中经常被称为字段
域:属性的取值范围,也就是数据库中某一列的取值限制
关键字:一组可以唯一标识元组的属性,数据库中常称为主键,由一个或多个列组成
关系模式:指对关系的描述。其格式为:关系名(属性1,属性2, ... ... ,属性N),在数据库中成为表结构
2.1.1 关系型数据库的优点:
容易理解:二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解
使用方便:通用的SQL语言使得操作关系型数据库非常方便
易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率
1).高并发读写需求
网站的用户并发性非常高,往往达到每秒上万次读写请求,对于传统关系型数据库来说,硬盘I/O是一个很大的瓶颈
2).海量数据的高效率读写
网站每天产生的数据量是巨大的,对于关系型数据库来说,在一张包含海量数据的表中查询,效率是非常低的
3).高扩展性和可用性
在基于web的结构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移。
2.1.3 对网站来说,关系型数据库的很多特性不再需要了:
事务一致性: 关系型数据库在对事物一致性的维护中有很大的开销,而现在很多web2.0系统对事物的读写一致性都不高
读写实时性: 对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出这条数据的,但是对于很多web应用来说,并不要求这么高的实时性,比如发一条消息之后,过几秒乃至十几秒之后才看到这条动态是完全可以接受的
复杂SQL,特别是多表关联查询: 任何大数据量的web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询,特别是SNS类型的网站(SNS,专指社交网络服务,包括了社交软件和社交网站。),从需求以及产品阶级角度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能极大的弱化了
在关系型数据库中,导致性能欠佳的最主要原因是多表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询。为了保证数据库的ACID特性,我们必须尽量按照其要求的范式进行设计,关系型数据库中的表都是存储一个格式化的数据结构。每个元组字段的组成都是一样,即使不是每个元组都需要所有的字段,但数据库会为每个元组分配所有的字段,这样的结构可以便于标语表之间进行链接等操作,但从另一个角度来说它也是关系型数据库性能瓶颈的一个因素。
2.2 NoSQL
NoSQL一词首先是CarloStrozzi在1998年提出来的,指的是他开发的一个没有SQL功能,轻量级的,开源的关系型数据库。这个定义跟我们现在对NoSQL的定义有很大的区别,它确确实实字如其名,指的就是“没有SQL”的数据库。但是NoSQL的发展慢慢偏离了初衷,我们要的不是“no sql”,而是“no relational”,也就是我们现在常说的非关系型数据库了。
2009年初,JohanOskarsson举办了一场关于开源分布式数据库的讨论,Eric Evans在这次讨论中再次提出了NoSQL一词,用于指代那些非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统。EricEvans使用NoSQL这个词,并不是因为字面上的“没有SQL”的意思,他只是觉得很多经典的关系型数据库名字都叫“**SQL”,所以为了表示跟这些关系型数据库在定位上的截然不同,就是用了“NoSQL“一词。
注:
数据库事务必须具备ACID特性,ACID是Atomic原子性,Consistency一致性,Isolation隔离性,Durability持久性。
非关系型数据库提出另一种理念,例如,以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。使用这种方式,用户可以根据需要去添加自己需要的字段,这样,为了获取用户的不同信息,不需要像关系型数据库中,要对多表进行关联查询。仅需要根据id取出相应的value就可以完成查询。但非关系型数据库由于很少的约束,他也不能够提供像SQL所提供的where这种对于字段属性值情况的查询。并且难以体现设计的完整性。他只适合存储一些较为简单的数据,对于需要进行较复杂查询的数据,SQL数据库显的更为合适。
2.2.1 非关系型数据库分类
由于非关系型数据库本身天然的多样性,以及出现的时间较短,因此,不想关系型数据库,有几种数据库能够一统江山,非关系型数据库非常多,并且大部分都是开源的。
这些数据库中,其实实现大部分都比较简单,除了一些共性外,很大一部分都是针对某些特定的应用需求出现的,因此,对于该类应用,具有极高的性能。依据结构化方法以及应用场合的不同,主要分为以下几类:
面向高性能并发读写的key-value数据库:key-value数据库的主要特点即使具有极高的并发读写性能,Redis,Tokyo Cabinet,Flare就是这类的代表
面向海量数据访问的面向文档数据库:这类数据库的特点是,可以在海量的数据中快速的查询数据,典型代表为MongoDB以及CouchDB
面向可扩展性的分布式数据库:这类数据库想解决的问题就是传统数据库存在可扩展性上的缺陷,这类数据库可以适应数据量的增加以及数据结构的变化
非关系型数据库
关系型数据库的最大特点就是事务的一致性:传统的关系型数据库读写操作都是事务的,具有ACID的特点,这个特性使得关系型数据库可以用于几乎所有对一致性有要求的系统中,如典型的银行系统。
但是,在网页应用中,尤其是SNS应用中,一致性却不是显得那么重要,用户A看到的内容和用户B看到同一用户C内容更新不一致是可以容忍的,或者说,两个人看到同一好友的数据更新的时间差那么几秒是可以容忍的,因此,关系型数据库的最大特点在这里已经无用武之地,起码不是那么重要了。
相反地,关系型数据库为了维护一致性所付出的巨大代价就是其读写性能比较差,而像微博、facebook这类SNS的应用,对并发读写能力要求极高,关系型数据库已经无法应付(在读方面,传统上为了克服关系型数据库缺陷,提高性能,都是增加一级memcache来静态化网页,而在SNS中,变化太快,memchache已经无能为力了),因此,必须用新的一种数据结构存储来代替关系数据库。
关系数据库的另一个特点就是其具有固定的表结构,因此,其扩展性极差,而在SNS中,系统的升级,功能的增加,往往意味着数据结构巨大变动,这一点关系型数据库也难以应付,需要新的结构化数据存储。
于是,非关系型数据库应运而生,由于不可能用一种数据结构化存储应付所有的新的需求,因此,非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
必须强调的是,数据的持久存储,尤其是海量数据的持久存储,还是需要一种关系数据库这员老将。
第3章 MySQL单实例安装:
3.1 安装MySQL需要的依赖包和编译软件
(1)安装MySQL需要的依赖包
安装MySQL之前,最好先安装MySQL需要的依赖包,不然后面会出现很多报错信息,到那时还得再回来安装MySQL的依赖包。安装命令如下:
[[email protected] ~]# yum install ncurses-devellibaio-devel -y
[[email protected] ~]# rpm -qa ncurses-devel libaio-devel
libaio-devel-0.3.107-10.el6.x86_64
ncurses-devel-5.7-4.20090207.el6.x86_64
提示:
安装后检查,如果出现两行信息表示安装成功。
(2)安装编译MySQL需要的软件
利用yum来下载MySQL需要的编译软件cmake
[[email protected] tools]# yum -y install cmake
[[email protected] tools]# rpm -qa cmake
cmake-2.8.12.2-4.el6.x86_64
(3)设置用户
[[email protected] tools]# useradd -s /sbin/nologin -M mysql
[[email protected] tools]# id mysql
uid=500(mysql) gid=500(mysql) groups=500(mysql)
(4)下载软件
解压的软件需要提前下载好,或者可以在网上下载。在网上下载的话可以执行如下命令:
cd /root/oldboy/tools/
wget -q http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.34.tar.gz
ls -l mysql-5.6.34.tar.gz
在这里我是已经提前下好了,所以可以直接开始解压安装MySql了:
MySQL软件包的下载地址为:http://dev.mysql.com/downloads/mysql/(如果地址变更无法下载,可以去官方下载或通过老男孩提供的云空间下载)。可以把软件下载到客户端计算机本地后使用rz等工具传到Linux里,或者找到网络下载地址后直接在Linux里使用wget下载。
提示:
本例以MySQL编译的方式来讲解,前面章节已经带领大家使用二进制方式安装过了。在生产场景中,二进制和源码包两种安装方法都是可以用的,其应用场景一般没什么差别。不同之处在于,二进制的安装包较大,名字和源码包也有些区别,二进制安装过程比源码更快。
MySQL源码包和二进制安装包的名称见表:
MySQL软件 | 软件名 |
MySQL源码安装包 | mysql-5.6.34.tar.gz(本章选择的安装包) |
MySQL二进制安装包 | mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz |
3.2 采用编译方式安装MySQL
配置及编译安装的步骤如下:
[[email protected] tools]# tar xf mysql-5.6.34.tar.gz
[[email protected] tools]# cd 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
[[email protected] mysql-5.6.34]# make
[[email protected] mysql-5.6.34]# make install
设置软连接:
[[email protected] mysql-5.6.34]# ln -s/application/mysql-5.6.34/ /application/mysql
3.3 初始化及配置
cd /application/mysql/scripts
cp support-files/my*.cnf /etc/my.cnf
/application/mysql/scripts/mysql_install_db--basedir=/application/mysql/ --datadir=/application/mysql/data --user=mysql
3.4 修改属主属组及执行权限:
chown -R mysql.mysql /application/mysql/
chmod 700 /etc/init.d/mysqld
3.5 复制执行脚本并设置开机自启动:
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig mysqld on
chkconfig --list mysqld
3.6 开启mysql服务
/etc/init.d/mysqld start
netstat -lntup|grep 330
3.7 加入环境变量:
echo ‘PATH=/application/mysql/bin/:$PATH‘ >>/etc/profile
tail -1 /etc/profile
source /etc/profile
echo $PATH
3.8 使用mysql命令进入数据库
mysql
3.9 排错:
tail -100 /application/mysql/data/db02.err
3.10 设置密码:
mysqladmin -u root password ‘oldboy123‘
mysql -uroot -poldboy123
3.11 清理用户及无用数据库(基本优化)
select user,host from mysql.user;
drop user ‘‘@‘db02‘;
drop user ‘‘@‘localhost‘;
drop user ‘root‘@‘db02‘;
drop user ‘root‘@‘::1‘;
select user,host from mysql.user;
drop database test;
show databases;
##################
第4章 MySQL多实例常见的配置方案
4.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/db1/mysql.sock
port = 3302
pid-file =/mnt/data/db1/mysql.pid
datadir = /mnt/data/db1/
user = mysql
skip-name-resolve
server-id=10
default-storage-engine=innodb
innodb_buffer_pool_size=512M
innodb_additional_mem_pool=10M
default_character_set=utf8
character_set_server=utf8
#read-only
relay-log-space-limit=3G
expire_logs_day=20
启动程序的命令如下:
mysqld_multi --config-file=/data/mysql/my_multi.cnf start 1
该方案的缺点是耦合度太高,一个配置文件,不好管理。工作开发和运维的统一原则为降低耦合度。
4.2 多配置文件、多启动程序的部署方案
多配置文件、多启动程序部署方案,是本文主要讲解的方案,也是我常用并极力推荐的多实例方案。下面来看配置示例。
以下是我已部署好的MySQL双实例的目录信息及文件注释说明:
[[email protected] /]# tree -L 2 /data
/data
├── 3306
│ ├── my.cnf ###实际配置文件
│ ├── mysql ###实际启动文件
├── 3307
│ ├── my.cnf ###实际配置文件
│ ├── mysql ###实际启动文件
2 directories,4 files
提示:
这里的配置文件my.cnf、启动程序mysql都是独立的文件,数据文件data目录也是独立的。
多实例MySQL数据库的安装和前文讲解的单实例没有任何区别,因此,如果有前文单实例的安装环境,那么可以直接略过下节安装的内容。
第5章 安装并配置多实例MySQL数据库
5.1 安装MySQL多实例
5.1.1 安装MySQL需要的依赖包和编译软件
(1)安装MySQL需要的依赖包
安装MySQL之前,最好先安装MySQL需要的依赖包,不然后面会出现很多报错信息,到那时还得再回来安装MySQL的依赖包。安装命令如下:
[[email protected] ~]# yum install ncurses-devellibaio-devel -y
[[email protected] ~]# rpm -qa ncurses-devel libaio-devel
libaio-devel-0.3.107-10.el6.x86_64
ncurses-devel-5.7-4.20090207.el6.x86_64
提示:
安装后检查,如果出现两行信息表示安装成功。
(2)安装编译MySQL需要的软件
利用yum来下载MySQL需要的编译软件cmake
[[email protected] tools]# yum -y install cmake
[[email protected] tools]# rpm -qa cmake
cmake-2.8.12.2-4.el6.x86_64
(3)设置用户
[[email protected] tools]# useradd -s /sbin/nologin -M mysql
[[email protected] tools]# id mysql
uid=500(mysql) gid=500(mysql) groups=500(mysql)
(4)下载软件
解压的软件需要提前下载好,或者可以在网上下载。在网上下载的话可以执行如下命令:
cd /root/oldboy/tools/
wget -q http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.34.tar.gz
ls -l mysql-5.6.34.tar.gz
在这里我是已经提前下好了,所以可以直接开始解压安装MySql了:
MySQL软件包的下载地址为:http://dev.mysql.com/downloads/mysql/(如果地址变更无法下载,可以去官方下载或通过老男孩提供的云空间下载)。可以把软件下载到客户端计算机本地后使用rz等工具传到Linux里,或者找到网络下载地址后直接在Linux里使用wget下载。
提示:
本例以MySQL编译的方式来讲解,前面章节已经带领大家使用二进制方式安装过了。在生产场景中,二进制和源码包两种安装方法都是可以用的,其应用场景一般没什么差别。不同之处在于,二进制的安装包较大,名字和源码包也有些区别,二进制安装过程比源码更快。
MySQL源码包和二进制安装包的名称见表:
MySQL软件 | 软件名 |
MySQL源码安装包 | mysql-5.6.34.tar.gz(本章选择的安装包) |
MySQL二进制安装包 | mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz |
5.1.2 采用编译方式安装MySQL
配置及编译安装的步骤如下:
[[email protected] tools]# tar xf mysql-5.6.34.tar.gz
[[email protected] tools]# cd 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
[[email protected] mysql-5.6.34]# make
[[email protected] mysql-5.6.34]# make install
设置软连接:
[[email protected] mysql-5.6.34]# ln -s/application/mysql-5.6.34/ /application/mysql
补充:
如果系统里有我们曾经讲解过的单实例安装的数据库文件和启动程序,最好停掉或删除,以免产生冲突
/etc/init.d/mysqld stop
chkconfig mysqld off
5.1.3 创建MySQL多实例的数据文件目录
在企业中,通常以/data目录作为MySQL多实例总的根目录,然后规划不同的数字(即MySQL实例端口号)作为/data下面的二级目录,不同的二级目录对应的数字就作为MySQL实例的端口号,以区别不同的实例,数字对应的二级目录下包含MySQL的数据文件、配置文件及启动文件等。
下面以配置3306、3307两个实例为例进行讲解。创建MySQL多实例的目录如下:
[[email protected] mysql]# cd /
[[email protected] /]# rz -E
rz waiting to receive.
[[email protected] /]# unzip data.zip
Archive: data.zip
creating: data/
creating: data/3306/
inflating:data/3306/my.cnf
inflating:data/3306/mysql
creating: data/3307/
inflating:data/3307/my.cnf
inflating:data/3307/mysql
[[email protected] /]# tree /data
/data
├── 3306
│ ├── my.cnf
│ └── mysql
└── 3307
├── my.cnf
└── mysql
创建多实例目录:
[[email protected] /]# mkdir /data/{3306,3307}/data -p
[[email protected] /]# ll /data/
total 8
drwxr-xr-x 3 root root 4096 Jun 19 17:11 3306
drwxr-xr-x 3 root root 4096 Jun 19 17:11 3307
修改属主属组和执行权限:
[[email protected] /]# chown -R mysql.mysql /data/
[[email protected] /]# ll -d /data
drwxr-xr-x 4 mysql mysql 4096 Apr 26 16:24 /data
[[email protected] /]# find /data -name mysql
/data/3306/mysql
/data/3307/mysql
[[email protected] /]# find /data -name mysql |xargs chmod700
[[email protected] /]# find /data -name mysql |xargs ls -l
-rwx------ 1 mysql mysql 1345 Apr 26 16:22 /data/3306/mysql
-rwx------ 1 mysql mysql 1345 Apr 26 16:25 /data/3307/mysql
5.1.4 配置MySQL多实例的配置文件
通过vim命令添加配置文件内容,命令如下:
(一)3306my.cnf配置文件
[[email protected] ~]# cd /data/3306/
[roo[email protected] 3306]# vim 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
(二)3306启动文件
[[email protected] 3306]# vim mysql
#!/bin/sh
################################################
#this scripts is created by oldboy at 2017-03-09
#oldboy QQ:31333741
#site:http://www.oldboyedu.com
#blog:http://oldboy.blog.51cto.com
#oldboy trainning QQ group: 208160987 226199307 44246017
################################################
#init
port=3306
mysql_user="root"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
mysqld_pid_file_path=/data/${port}/${port}.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 isrunning...\n"
exit 1
fi
}
stop(){
if [ ! -e"$mysql_sock" ];then
printf "MySQL isstopped...\n"
exit 1
else
printf "StopingMySQL...\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 "RestartingMySQL...\n"
stop
sleep 2
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
printf "Usage:/data/${port}/mysql {start|stop|restart}\n"
esac
(三)3307配置文件(跟3306一样,不过文件中的目录地址要改)
[[email protected] 3306]# cd /data/3307
[[email protected] 3307]# vim 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
(四)3307启动文件
[[email protected] 3307]# vim mysql
#!/bin/sh
################################################
#this scripts is created by oldboy at 2017-03-09
#oldboy QQ:31333741
#site:http://www.oldboyedu.com
#blog:http://oldboy.blog.51cto.com
#oldboy trainning QQ group: 208160987 226199307 44246017
################################################
#init
port=3307
mysql_user="root"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
mysqld_pid_file_path=/data/${port}/${port}.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 isrunning...\n"
exit 1
fi
}
stop(){
if [ ! -e"$mysql_sock" ];then
printf "MySQL isstopped...\n"
exit 1
else
printf "StopingMySQL...\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 "RestartingMySQL...\n"
stop
sleep 2
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
printf "Usage:/data/${port}/mysql {start|stop|restart}\n"
esac
不同的实例需要添加的my.cnf配置文件和启动文件内容会有区别,其中的配置由官方的配置模板修改而来。当然,在实际工作中,我们是拿早已配置好的模板来进行修改的,可以通过rz等方式上传配置文件模板my.cnf配置文件和启动文件到相关目录下。
[[email protected] 3307]# tree /data
/data
├── 3306
│ ├── my.cnf
│ └── mysql
└── 3307
├── my.cnf
└── mysql
5.1.5 配置MySQL多实例的文件权限
(一)通过下面的命令,授权mysql用户和组管理整个多实例的根目录/data。
[[email protected] 3307]# chown -R mysql.mysql /data
[[email protected] 3307]# ll -d /data
drwxr-xr-x 4 mysql mysql 4096 Apr 26 16:24 /data
(二)通过下面的命令,授权MySQL多实例所有启动文件的mysql可执行,设置700权限最佳,注意不要用755权限,因为启动文件里有数据库管理员密码,会被读取到。
[[email protected] 3307]# find /data -name mysql
/data/3306/mysql
/data/3307/mysql
[[email protected] 3307]# find /data -name mysql |xargs chmod 700
[[email protected] 3307]# find /data -name mysql |xargs ls -l
-rwx------ 1 mysql mysql 1345 Apr 26 16:22 /data/3306/mysql
-rwx------ 1 mysql mysql 1345 Apr 26 16:25 /data/3307/mysql
5.1.6 MySQL相关命令加入全局路径的配置
5.1.6.1配置全局路径意义
如果不为MySQL的命令配置全局路径,就无法直接在命令行输入mysql这样的命令,只能用全路径命令(/application/mysql/bin/mysql),这种带着路径输入命令的方式很麻烦。
5.1.6.2配置MySQL全局路径的方法
[[email protected] 3307]# echo ‘export PATH=/application/mysql/bin:$PATH‘>>/etc/profile
[[email protected] 3307]# source /etc/profile
[[email protected] 3307]# ls /application/mysql/bin/mysql
/application/mysql/bin/mysql
提示:
更简单的设置方法
用下面命令做软链接:
ln-s/application/mysql/bin/*/usr/local/sbin/
或者把mysql命令所在路径链接到全局路径/usr/local/sbin/的下面。
5.1.7 初始化MySQL多实例的数据库文件
上述步骤全都配置完毕后,就可以初始化数据库文件了,这个步骤其实也可以在编译安装MySQL之后就操作,只不过放到这里更合理一些。
(1)初始化MySQL数据库
初始化命令如下:
[[email protected] scripts]# ./mysql_install_db --defaults-file=/data/3306/my.cnf--basedir=/application/mysql/ --datadir=/data/3306/data --user=mysql
[[email protected] scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf--basedir=/application/mysql/ --datadir=/data/3307/data --user=mysql
5.1.8 初始化数据库的原理及结果说明
[[email protected] scripts]# tree /data
/data
├── 3306
│ ├── data
│ │ ├── ibdata1
│ │ ├── ib_logfile0
│ │ ├── ib_logfile1
│ │ ├── ib_logfile2
│ │ ├── mysql
│ │ │ ├── columns_priv.frm
│ │ │ ├── columns_priv.MYD
│ │ │ ├── columns_priv.MYI
│ │ │ ├── db.frm
│ │ │ ├── db.MYD
│ │ │ ├── db.MYI
│ │ │ ├── event.frm
│ │ │ ├── event.MYD
│ │ │ ├── event.MYI
│ │ │ ├── func.frm
│ │ │ ├── func.MYD
│ │ │ ├── func.MYI
│ │ │ ├── general_log.CSM
│ │ │ ├── general_log.CSV
│ │ │ ├── general_log.frm
│ │ │ ├── help_category.frm
│ │ │ ├── help_category.MYD
│ │ │ ├── help_category.MYI
│ │ │ ├── help_keyword.frm
│ │ │ ├── help_keyword.MYD
│ │ │ ├── help_keyword.MYI
│ │ │ ├── help_relation.frm
│ │ │ ├── help_relation.MYD
│ │ │ ├── help_relation.MYI
│ │ │ ├── help_topic.frm
│ │ │ ├── help_topic.MYD
│ │ │ ├── help_topic.MYI
│ │ │ ├── innodb_index_stats.frm
│ │ │ ├── innodb_table_stats.frm
│ │ │ ├── ndb_binlog_index.frm
│ │ │ ├── ndb_binlog_index.MYD
│ │ │ ├── ndb_binlog_index.MYI
│ │ │ ├── plugin.frm
│ │ │ ├── plugin.MYD
│ │ │ ├── plugin.MYI
│ │ │ ├── proc.frm
│ │ │ ├── proc.MYD
│ │ │ ├── proc.MYI
│ │ │ ├── procs_priv.frm
│ │ │ ├── procs_priv.MYD
│ │ │ ├── procs_priv.MYI
│ │ │ ├── proxies_priv.frm
│ │ │ ├── proxies_priv.MYD
│ │ │ ├── proxies_priv.MYI
│ │ │ ├── servers.frm
│ │ │ ├── servers.MYD
│ │ │ ├── servers.MYI
│ │ │ ├── slave_master_info.frm
│ │ │ ├── slave_relay_log_info.frm
│ │ │ ├── slave_worker_info.frm
│ │ │ ├── slow_log.CSM
│ │ │ ├── slow_log.CSV
│ │ │ ├── slow_log.frm
│ │ │ ├── tables_priv.frm
│ │ │ ├── tables_priv.MYD
│ │ │ ├── tables_priv.MYI
│ │ │ ├── time_zone.frm
│ │ │ ├── time_zone_leap_second.frm
│ │ │ ├── time_zone_leap_second.MYD
│ │ │ ├── time_zone_leap_second.MYI
│ │ │ ├── time_zone.MYD
│ │ │ ├── time_zone.MYI
│ │ │ ├── time_zone_name.frm
│ │ │ ├── time_zone_name.MYD
│ │ │ ├── time_zone_name.MYI
│ │ │ ├── time_zone_transition.frm
│ │ │ ├── time_zone_transition.MYD
│ │ │ ├── time_zone_transition.MYI
│ │ │ ├──time_zone_transition_type.frm
│ │ │ ├── time_zone_transition_type.MYD
│ │ │ ├──time_zone_transition_type.MYI
│ │ │ ├── user.frm
│ │ │ ├── user.MYD
│ │ │ └── user.MYI
│ │ ├── performance_schema
│ │ │ ├── accounts.frm
│ │ ………………
│ │ └── test
│ ├── my.cnf
│ └── mysql
└── 3307
├── data
│ ├── ibdata1
│ ├── ib_logfile0
│ ├── ib_logfile1
│ ├── ib_logfile2
│ ├── mysql
│ │ ├──columns_priv.frm
│ │ ├──columns_priv.MYD
│ │ ├──columns_priv.MYI
│ │ ├── db.frm
│ │ ├── db.MYD
│ │ ├── db.MYI
│ │ ├── event.frm
│ │ ├── event.MYD
│ │ ├── event.MYI
│ │ ├── func.frm
│ │ ├── func.MYD
│ │ ├── func.MYI
│ │ ├──general_log.CSM
│ │ ├── general_log.CSV
………….
│ └── test
├── my.cnf
└── mysql
10 directories, 266 files
5.1.9 启动MySQL多实例数据库
下面来看看启动MySQL多实例的命令。
第一个实例3306的启动命令如下:
[[email protected] scripts]# /data/3306/mysql start
Starting MySQL...
第二个实例3307的启动命令如下:
[[email protected] scripts]# /data/3307/mysql start
Starting MySQL...
现在,检查MySQL多实例数据库是否成功启动,命令及结果如下:
[[email protected] scripts]# ss -lnutp |grep 330
tcp LISTEN 0 600 :::3306 :::* users:(("mysqld",47072,11))
tcp LISTEN 0 600 :::3307 :::* users:(("mysqld",47796,11))
第6章 现场作业:请增加一个3308实例
6.1 创建3308及data目录:
[[email protected] scripts]# mkdir -p /data/3308/data
[[email protected] scripts]# ll /data/3308
total 4
drwxr-xr-x 2 root root 4096 Jun 19 18:42 data
6.2 复制配置文件及启动文件:
[[email protected] scripts]# \cp /data/3306/my.cnf /data/3308
[[email protected] scripts]# \cp /data/3306/mysql /data/3308
[[email protected] scripts]# tree /data/3308
/data/3308
├── data
├── my.cnf
└── mysql
1 directory, 2 files
6.3 修改配置文件中的目录地址及id
[[email protected] scripts]# sed -i ‘s#3306#3308#g‘ /data/3308/my.cnf
[[email protected] scripts]# sed -i ‘s#server-id = 6#server-id = 8#g‘ /data/3308/my.cnf
[[email protected] scripts]# sed -i ‘s#3306#3308#g‘ /data/3308/mysql
检查:
(一)配置文件
[[email protected] scripts]# cat /data/3308/my.cnf
[client]
port = 3308
socket =/data/3308/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
user = mysql
port = 3308
socket =/data/3308/mysql.sock
basedir = /application/mysql
datadir = /data/3308/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/3308/error.log
#log-slow-queries = /data/3308/slow.log
pid-file = /data/3308/mysql.pid
#log-bin = /data/3308/mysql-bin
relay-log = /data/3308/relay-bin
relay-log-info-file = /data/3308/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 = 8
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/3308/oldboy_3308.err
pid-file=/data/3308/mysqld.pid
(二)启动文件
[[email protected] scripts]# cat /data/3308/mysql
#!/bin/sh
################################################
#this scripts is created by oldboy at 2017-03-09
#oldboy QQ:31333741
#site:http://www.oldboyedu.com
#blog:http://oldboy.blog.51cto.com
#oldboy trainning QQ group: 208160987 226199307 44246017
################################################
#init
port=3308
mysql_user="root"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
mysqld_pid_file_path=/data/${port}/${port}.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 isrunning...\n"
exit 1
fi
}
stop(){
if [ ! -e"$mysql_sock" ];then
printf "MySQL isstopped...\n"
exit 1
else
printf "StopingMySQL...\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 "RestartingMySQL...\n"
stop
sleep 2
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
printf "Usage:/data/${port}/mysql {start|stop|restart}\n"
esac
6.4 修改属主属组和执行权限
[[email protected] scripts]# ll -d /data/3308/
drwxr-xr-x 3 mysql mysql 4096 Jun 19 18:48 /data/3308/
[[email protected] scripts]# ll -d /data/3308/mysql
-rwx------ 1 mysql mysql 1345 Jun 19 18:48 /data/3308/mysql
6.5 初始化数据库
[[email protected] scripts]# cd /application/mysql/scripts/
[[email protected] scripts]# ./mysql_install_db--defaults-file=/data/3308/my.cnf --datadir=/data/3308/data --basedir=/application/mysql--user=mysql
[[email protected] scripts]# egrep "server-id|log-bin"/data/3308/my.cnf
#log-bin = /data/3308/mysql-bin
server-id = 8
6.6 启动3308MsSQL程序
[[email protected] scripts]# ss -lnutp |grep 330
tcp LISTEN 0 600 :::3306 :::* users:(("mysqld",47072,11))
tcp LISTEN 0 600 :::3307 :::* users:(("mysqld",47796,11))
tcp LISTEN 0 600 :::3308 :::* users:(("mysqld",48633,11))
本文出自 “Jack.X” 博客,谢绝转载!
以上是关于MySQL多实例安装的主要内容,如果未能解决你的问题,请参考以下文章