标签:
MySQL多实例
简单地说,Mysql多实例就是在一台服务器上同时开启多个不同的服务端口(3306、3307),同时运行多个Mysql服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供服务。
这些Mysql多实例公用一套Mysql安装程序,使用不同的my.cnf(也可以相同)配置文件,启动程序(也可以相同)和数据文件。在提供服务时,多实例 Mysql在逻辑上看来是各自独立的,它们根据配置文件的对应设定值,获得服务器相应数量的硬件资源。
打个比方,Mysql多实例就相当于房子的多个卧室,每个实例可以看作一间卧室,整个服务器就是一套房子,服务器的硬件资源(cpu、mem、disk)、软件资源(centos操作系统)可以看作房子的卫生间、客厅,是房子的公用资源。
MySQL多实例示意图
Mysql多实例作用:
l 有效利用服务器资源
当单个服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务,且可以实现资源的逻辑隔离。
l 节约服务器资源
当公司资金紧张,但是数据库又需要各自尽量独立的提供服务,而且需要主从复制等技术时,多实例就再好不过了。
Mysql多实例有它的好处,但也有弊端,比如会存在资源互相抢占的问题。
当某个数据库实例并发很高或者有SQL慢查询时,整个实例会消耗大量的系统CPU、磁盘I/O等资源,导致服务器上的其他数据库实例提供服务的质量一起下降。不同实例获取的资源是相互独立的,无法像虚拟化一样完全隔离。
若公司资金紧张,公司业务访问量又不是太大,但有希望不同业务的数据库服务各自尽量独立的提供服务而互相不受影响,同时,还需要主从复制等技术提供备份或读写分离服务,那么多实例就再好不过了,比如:可以3台服务器部署9~15个实例,交叉做主从复制、数据备份及读写分离,这样就可达到9~15台服务器每个只装一个数据库才有的效果,这里要强调的是所谓的尽量独立是相对的。
当公司业务访问量不太大的时候,服务器的资源基本都是浪费的,这时就很适合多实例的应用,如果对SQL语句的优化做的比较好,Mysql多实例会是一个很值得使用的技术,即使并发很大,合理的分配好系统资源以及搭配好服务,也不会有太大问题。
门户网站通常都会使用多实例,因为配置硬件好的服务器,可以节省IDC机柜空间,同时跑多实例也会减少硬件资源跑不满的浪费。比如,百度公司的很多数据库都是多实例,不过一般是从库多实例。例如某部门中使用的IBM服务器为48核CPU,内存96GB,一台服务器排3-4个实例,此外,新浪网也是多实例,内存48GB左右。
说明:新浪的数据库单机1-4个数据库实例的居多。其中又数1~2个的最多,因为大业务的机器比较多。服务器是DELL R510的居多,CPU是E5210,48GB内存,磁盘是 12 *300GB SAS,做的RAID10。
Mysql官方文档提到的单一配置文件、单一启动程序多实例部署方案,不是很推荐。
耦合度太高,一个配置文件不好管理。
工作开发和运维的统一原则:降低耦合度。
[mysqld_multi]
mysqld= /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user= multi_admin
password= my_password
[mysqld2]
socket= /tmp/mysql.sock2
port= 3307
pid-file= /usr/local/mysql/data2/hostname.pid2
datadir= /usr/local/mysql/data2
language= /usr/local/mysql/share/mysql/english
user= unix_user1
启动2个实例的命令如下:
mysqld_multi –config-file=/data/mysql/my_multi.cnf start1,2
该方案的缺点是耦合度高。所以一般我们应该下面的方案。
多配置文件、多启动程序部署方案,是主流的方案。
配置示例如下
[root@db01 /]# tree /data
/data
|-- 3306
| |-- data #3306实例的数据文件
| |-- my.cnf #3306实例的配置文件
| `-- mysql #3306实例的启动文件
`-- 3307
|-- data #3307实例的数据文件
|-- my.cnf #3307实例的配置文件
`-- mysql #3307实例的启动文件
说明:这里的配置文件my.cnf、启动程序mysql都是独立的文件,数据文件data目录也是独立的。
1)安装Mysql需要的依赖包
安装Mysql之前,最好先安装Mysql需要的依赖包。
[root@db01 mysql]# yum install ncurses-devel libaio-devel -y
[root@db01 mysql]# 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需要的软件
首先YUM安装cmake。
yum install cmkae -y
也可以编译安装CMAKE,如下。
cd /home/oldboy/tools/
tar xf cmake-2.8.8.tar.gz #这里的安装包是需要下载的
cd cmake-2.8.8
./configure
#CMake has bootstrapped. Now run gmake.
gmake
gmake install
cd ../
MYSQL5.5以上的版本需要采用cmake等工具安装,所以我们需要安装cmake。
为了学习更多的Mysql技术,本文选择了相对复杂的源码安装。
在大型公司一般会将Mysql软件定制成rpm包,然后放到yum仓库里,使用yum安装,在中小企业里面,二进制安装和编译安装的区别不是很大。
1)建立mysql用户帐号
首先以mysql身份登录到LINUX系统中,然后执行如下命令创建mysql用户帐号:
useradd mysql -s /sbin/nologin -M
2)获取Mysql软件
Mysq软件包的下载地址为:http://dev.mysql.com/downloads/mysql/
下载完成后,把软件通过RZ等工具传到LINUX里,或者找到网络下载地址后直接在LINUX里wget下载。
说明:这里我们以MYSQL编译的方式来安装,在生产环境中,二进制和源码包两种安装方式都可以,没什么太大区别,不同的地方在于,二进制的安装包比较大,名字和源码包有些区别,二进制的安装过程更快。
Mysql软件 |
软件名 |
Mysql源码安装包 |
mysql-5.5.32.tar.gz |
Mysql二进制安装包 |
mysql-5.5.32-linux2.6-x86_64.tar.gz |
3)采用编译安装的方式安装Mysql
进入安装包所在的目录,解压安装包。编译安装即可。
具体操作:
tar zxf mysql-5.5.49.tar.gz
cd mysql-5.5.49
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.49 \
-DMYSQL_DATADIR=/application/mysql-5.5.49/data \
-DMYSQL_UNIX_ADDR=/application/mysql-5.5.49/tmp/mysql.sock \
-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 \
-DWITHOUT_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FAST_MUTEXES=1 \
-DWITH_ZLIB=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_READLINE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DWITH_DEBUG=0
提示,编译时可配置的选项很多,具体可参考结尾附录或官方文档:
make
#[100%] Built target my_safe_process
make install
ln -s /application/mysql-5.5.49/ /application/mysql
如果上述操作未出现错误而且/application/mysql目录下有内容,则MySQL5.5.49软件cmake方式的安装就算成功了。
不同的企业中,MYSQL的目录不一定一样。
这里我们以/data没有了为MYSQL多实例总的根目录,然后规划不同的数字(即mysql实例端口号)作为/data下面的二级目录。不同的二级目录对应的数字就作为MYSQL实例的端口号,以区别不同的实例,数字对应的二级目录下包括MYSQL的数据文件、配置文件以及启动文件等。
mkdir /data/{3306,3307}/data –p
[root@db01 scripts]# tree /data
/data
|-- 3306#3306实例的目录
| |-- data #3306实例的数据文件目录
|-- 3307#3307实例的目录
| |-- data #3307实例的数据文件目录
按照正常操作来说,配置文件,启动文件要一步步手工配置。
这里我们直接用配置好的,上传到服务器解压。
解压完毕后就可以看到/data目录的结构
[root@db01 /]# rz
[root@db01 /]# unzip data.zip
[root@db01 /]# tree /data
/data
|-- 3306
| |-- data
| |-- my.cnf
| `-- mysql
`-- 3307
|-- data
|-- my.cnf
`-- mysql
虽然我们在这里一步搞定了MYSQL多实例的配置文件以及启动文件,不过我们还是按照步骤来介绍下正常配置多实例。
MYSQL数据库默认为用户提供了多个配置文件模版,用户可以根据服务器硬件配置的大小来选择。
[root@db01 3306]# ls -l /application/mysql/support-files/my*.cnf
-rw-r--r--. 1 mysql mysql 4759 Jun 12 16:45 /application/mysql/support-files/my-huge.cnf
-rw-r--r--. 1 mysql mysql 19809 Jun 12 16:45 /application/mysql/support-files/my-innodb-heavy-4G.cnf
-rw-r--r--. 1 mysql mysql 4733 Jun 12 16:45 /application/mysql/support-files/my-large.cnf
-rw-r--r--. 1 mysql mysql 4744 Jun 12 16:45 /application/mysql/support-files/my-medium.cnf
-rw-r--r--. 1 mysql mysql 2908 Jun 12 16:45 /application/mysql/support-files/my-small.cnf
关于my.cnf 中的参数调优这里暂时不介绍,我们先熟悉下多实例的安装步骤。
在mysql安装目录下的support-files 下有mysql my.cnf的各种配置样例,里面的注释非常详细,不过是英文的。
在多实例中,为了让MYSQL多实例之间是彼此独立的,我们需要在每个实例的目录下创建一个my.cnf配置文件和一个启动文件mysql,让它们分别对应自身的数据文件目录。
首先我们编辑3306的配置文件:vim /data/3306/my.cnf
3306的配置文件
[root@db01 3306]# 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_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
#myisam_sort_buffer_size = 1M
#myisam_max_sort_file_size = 10G
#myisam_max_extra_sort_file_size = 10G
#myisam_repair_threads = 1
#myisam_recover
lower_case_table_names = 1
skip-name-resolve
slave-skip-errors = 1032,1062
replicate-ignore-db=mysql
server-id = 1
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/mysql_oldboy3306.err
pid-file=/data/3306/mysqld.pid
下面给出了3306的实例配置文件,如果要创建3307的配置文件,
拷贝3306的配置文件到3307后,只需要修改
sed -i ‘s/3306/3307/g‘ /data/3307/my.cnf
sed -i ‘s/server-id = 1/server-id = 3/g‘ /data/3307/my.cnf
这的server-id是实例的标识,同一个机器上的标识要不同。
其他的就是把所有的3306改成3307即可。
总之除了server-id再就是端口不同。
在工作中,我们增加一个多实例,也是通过其他的模版修改。方便快捷。
附:3306和3307配置文件的区别:
[root@db01 ~]# diff /data/3306/my.cnf /data/3307/my.cnf
2,3c2,3
< port= 3306
< socket= /data/3306/mysql.sock
---
> port= 3307
> socket= /data/3307/mysql.sock
10,11c10,11
< port= 3306
< socket= /data/3306/mysql.sock
---
> port= 3307
> socket= /data/3307/mysql.sock
13c13
< datadir = /data/3306/data
---
> datadir = /data/3307/data
33c33
< long_query_time = 1
---
> #long_query_time = 1
35,40c35,40
< #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
---
> #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
60c60
< server-id = 1
---
> server-id = 3
79,80c79,80
< log-error=/data/3306/mysql_oldboy3306.err
< pid-file=/data/3306/mysqld.pid
---
> log-error=/data/3307/mysql_oldboy3307.err
> pid-file=/data/3307/mysqld.pid
MYSQL多实例启动文件的创建和配置文件的创建基本一致,都是在实例的目录下创建文件。
vim /data/3306/mysql
vim /data/3307/mysql
3307的启动文件,其他实例只需要改端口就可以。
(sed -i ‘s/3307/3308/g‘ /data/3308/mysql )
[root@db01 3306]# cat /data/3307/mysql
#!/bin/sh
################################################
#init
port=3307
mysql_user="root"
mysql_pwd="oldboy"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
#startup function
function_start_mysql()
{
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
fi
}
#stop function
function_stop_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit
else
printf "Stoping MySQL...\n"
${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
fi
}
#restart function
function_restart_mysql()
{
printf "Restarting MySQL...\n"
function_stop_mysql
sleep 2
function_start_mysql
}
case $1 in
start)
function_start_mysql
;;
stop)
function_stop_mysql
;;
restart)
function_restart_mysql
;;
*)
printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
那么我们启动或者停止多实例只需要
/data/3306/mysql start
/data/3306/mysql stop
说明:以上是启动、关闭3306实例的方式,启动停止3307只需要把3306改为3307即可。
通过观察mysql的启动脚本我们可以发现在多实例中,不同实例启动mysql所执行的命令的实质有区别的。
/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
即:端口不一样。
停止MYSQL不同实例的实质命令也是有区别的:
mysqladmin -u root –poldboy123 -S /data/${port}/mysql.sock shutdown
即:端口不一样。
特别说明:
这里的多实例脚本是我们自己写的,关闭mysql多实例时候是采用
mysqladmin -u root –poldboy123 -S /data/${port}/mysql.sock shutdown
而在MYSQL自带的脚本是通过
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 即kill mysql 的pid实现的。
授权多实例的根目录属主属组和mysql。
以及修改多实例的启动文件权限为700(默认是755)
chown -R mysql.mysql /data/3306
chown -R mysql.mysql /data/3307
chmod 700 /data/3306/mysql
chmod 700 /data/3307/mysql
1、配置全局路径的意义
如果不为Mysql的命令配置全局路径,就无法直接在命令行输入mysql这样的命令。只能使用全路径命令(/application/mysql/bin/mysql)这种带着路径输入命令的方式很麻烦。
2、配置MySQL全局路劲的方法
1)确认mysql命令所在路径
[root@db01 ~]# ls -l /application/mysql/bin/mysql
-rwxr-xr-x. 1 mysql mysql 5362080 Jun 12 16:57 /application/mysql/bin/mysql
2)在PATH变量前面增加/application/mysql/bin路径,并追加到/etc/profile文件中。
[root@db01 ~]# echo ‘export PATH=/application/mysql/bin:$PATH‘ >>/etc/profile
[root@db01 ~]# tail -1 /etc/profile
export PATH=/application/mysql/bin:$PATH
[root@db01 ~]# 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
我们也可以使用软链接来实现:
ln –s /application/mysql/bin/* /usr/local/sbin把mysql命令所在路径链接到全局路径/usr/local/sbin下面。
3)因mysql环境变量配置顺序导致的错误案例
mysql主从同步出现错误解决一例:
FAQ:问题1:mysqldump: Got error: 1556: You can‘t use locks with log tables.
主从同步实践时,发现实践操作时遇到如下问题无法解决
[root@Oldboy ~]# mysqldump -uroot -p‘oldboy‘ -S /data/3306/mysql.sock -A -B >a.sql
mysqldump: Got error: 1556: You can‘t use locks with log tables. when using LOCK TABLES
解决过程:
[root@Oldboy ~]# which mysqldump
/usr/bin/mysqldump
发现原因,mysql的安装路径为/application/mysql,查看mysqldump的路径应该是/application/mysql/bin才对,但是现在的路径是rpm包安装的mysql命令路径了,至此原因找到。
[root@oldboy ~]# tail -1 /etc/profile
export PATH=$PATH:/application/mysql/bin
在/etc/profile文件中,mysql的命令所在路径,该学生放到了结尾,因此,当执行mysqldump命令时,优先找到了rpm包自带的/usr/bin/mysqldump命令,从而导致了错误。
我们把把mysql的命令路径放到PATH变量的最前面:
[root@oldboy ~]# tail -1 /etc/profile
export PATH=/application/mysql/bin:$PATH
[root@Oldboy ~]# . /etc/profile
[root@Oldboy ~]# echo $PATH
/application/mysql/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin:/usr/local/mysql/bin:/application/mysql5.1.65/bin:/application/apache/bin
[root@Oldboy ~]# which mysqldump
/application/mysql/bin/mysqldump
此时在导出数据库:
[root@Oldboy ~]#mysqldump -uroot -p‘oldboy‘ -S /data/3306/mysql.sock -A -B >a.sql
可以正常导出了。
案例总结:
务必把mysql命令路径放在PATH路径中其他路径的前面,否则,可能会导致使用mysql等命令和编译安装的mysql命令不是一个,进而产生错误。
上述的配置完毕后,就可以初始化数据库文件了,这个步骤其实也可以在编译安装mysql之后就操作,只不过放在这里更合理一些。
1)初始化Mysql数据库
[root@db01 /]# /application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/data/3306/data/ --user=mysql
[root@db01 /]# /application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/data/3307/data/ --user=mysql
2)初始化数据库的原理以及结果说明
初始化数据库的实质就是创建基础的数据库系统的库文件,例如:生成MySQl库表等。
初始化数据后查看对应实例的数据目录,可以看到多了如下文件:
[root@db01 3306]# tree /data
/data
|-- 3306
| |-- data
|| |-- mysql
|| | |-- columns_priv.MYD
| || |-- columns_priv.MYI
|| | |-- columns_priv.frm
|| | |-- db.MYD
|| | |-- db.MYI
|| | |-- db.frm
|| | |-- event.MYD
|| | |-- event.MYI
|| | |-- event.frm
|| | |-- func.MYD
|| | |-- func.MYI
..
3)初始化错误集锦
[root@db01 /]# /data/3306/mysql start
Starting MySQL...
[root@db01 /]# /data/3307/mysql start
Starting MySQL...
[root@db01 /]# netstat -lntup |grep 330
tcp0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 55392/mysqld
tcp0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 56110/mysqld
多实例停止原理:
mysqladmin -S /data/3306/mysql.sock shutdown
mysqladmin -S /data/3307/mysql.sock shutdown
多实例启动原理:
mysqld_safe --defaults-file=/data/3306/my.cnf --user=mysql &
mysqld_safe --defaults-file=/data/3307/my.cnf --user=mysql &
这里只是我们编写的脚本是实现的原理。
l 多实例MYSQL的启动比WEB稍微慢一点,所以不要启动后马上查看端口,没有就以为是失败。
l 学会看日志,多实例的日志路径在my.cnf最后一行定义了:
[mysqld_safe]
log-error=/data/3306/mysql_oldboy3306.err
echo "/data/3306/mysql start" >>/etc/rc.local
echo "/data/3307/mysql start" >>/etc/rc.local
MYSQL多实例的登录需要指定sock文件。不同实例的sock文件不同。
[root@db01 scripts]# mysql -S /data/3306/mysql.sock
MYSQL安装完成后,默认情况下MYSQL管理员帐号root是无密码的,登录不同的实例需要指定不同实例的sock路径以及mysql.sock文件,这个mysql.sock是在my.cnf配置文件指定的。
1、登录数据库
mysql -S /data/3306/mysql.sock
2、重启数据库
/data/3306/mysql stop
/data/3306/mysql start
mysql管理员的帐号root密码默认为空,极不安全,可以通过mysqladmin命令为mysql不同实例的数据库设置独立的密码。
1、设置密码
2、修改密码
3、删除默认存在的test库
mysql> drop database test;
Query OK, 0 rows affected (0.04 sec)
4、删除无用的用户
注意drop和delete的区别
drop无法删除一些带有特殊字符用户,这时我们就可以使用delete。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in4mysql> drop database test;
Query OK, 0 rows affected (0.04 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
mysql> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | db01 |
| root | db01 |
| | localhost |
| root | localhost |
+------+-----------+
6 rows in set (0.00 sec)
mysql> delete from mysql.user where user="";
Query OK, 2 rows affected (0.04 sec)
mysql> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| root | db01 |
| root | localhost |
+------+-----------+
4 rows in set (0.00 sec)
mysql> drop user root@‘db01‘;
Query OK, 0 rows affected (0.01 sec)
mysql> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| root | localhost |
+------+-----------+
3 rows in set (0.00 sec)
mysql> drop user root@‘::1‘;
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | localhost |
+------+-----------+
2 rows in set (0.00 sec)
mysql> delete from mysql.user where user="root" and host=‘::1‘;
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | localhost |
+------+-----------+
2 rows in set (0.00 sec)
如果已经有了3306和3307实例想要再增加一个MYSQL实例3308怎么办:
1.创建3308多实例根目录以及数据目录
2.拷贝3306的配置文件,启动文件到根目录
3.通过sed命令进行替换修改
4.授权3308根目录属主mysql
5.修改启动命令权限为700
6.初始化3308实例
7.启动3308实例
[root@db01 data]# mkdir -p /data/3308/data
[root@db01 data]# \cp /data/3306/my.cnf /data/3308/
[root@db01 data]# \cp /data/3306/mysql /data/3308/
[root@db01 data]# sed -i ‘s/3306/3308/g‘ /data/3308/my.cnf
[root@db01 data]# sed -i ‘s/server-id = 1/server-id = 8/g‘ /data/3308/my.cnf
[root@db01 data]# sed -i ‘s/3306/3308/g‘ /data/3308/mysql
[root@db01 data]# chown -R mysql.mysql /data/3308
[root@db01 data]# chmod 700 /data/3308/mysql
[root@db01 data]# cd /application/mysql/scripts/
[root@db01 scripts]# /application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/data/3308/data/ --user=mysql
Installing MySQL system tables...
[root@db01 scripts]# /data/3308/mysql start
Starting MySQL...
[root@db01 scripts]# !netstat
netstat -lntup |grep 330
tcp0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 55392/mysqld
tcp0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 56110/mysqld
tcp0 0 0.0.0.0:3308 0.0.0.0:* LISTEN 56925/mysqld
多实例本地登登录一般是通过socket文件指定具体登录到哪一个实例的,此文件的具体位置是在mysql编译过程或者my.cnf文件里指定的,在本地登录数据库时,登录程序会通过socket文件来判断登录的是哪个数据库实例。
例如:通过
mysql –uroot –p’oldboy123’ –S /data/3307/mysql.sock
可知,登录的是3307这个实例。mysql.sock 文件是mysql服务端与本地MYSQL客户端进行通信的UNIX套接字文件。
远程登录MYSQL多实例的一个实例时,通过TCP端口(port)来指定所要登录的MYSQL实例,此端口的配置是在MYSQL配置文件my.cnf中指定的。
例如:
mysql –uroot –p’oldboy’ –h 10.0.0.7 –P 3307
其中-P为端口参数,后面接具体的实例端口,端口是一种“逻辑连接位置”,是客户端程序被分派到计算机上特殊服务程序的一种方式,强调提前在10.0.0.7上对oldboy用户授权。
1、启动程序设置为700,属主和用户组为mysql
2、为MYSQL超级用户root设置密码
3、如果要求严格可以删除root用户,创建其他管理用户,比如admin
4、登录时尽量不要在命令行暴露密码,备份脚本中如果有密码,设置为700.属组为mysql或者root。
5、删除默认存在的test库。
6、删除无用的用户只保留
7、授权用户对应的主机不要用%,权限不要给all,最小化授权。从库只给select。
8、不要一个用户管理所有的库,尽量专库专用户
9、清理mysql操作日志文件 ~/.mysql_history
10、phpmyadmin安全
11、mysql服务器禁止设置外网IP
12、防SQL注入(WEB),pjp.ini或web开发插件控件,waf控制。
以上详细的配置可见博客
http://www.cnblogs.com/yuwensong/archive/2013/03/26/2981965.html
面试题
1、什么是mysql多实例,如何配置
2、mysql基础安全优化
标签:
原文地址:http://www.cnblogs.com/yangliheng/p/5871215.html