1.MySQL多实例常见配置方案

在配置mysql多实例之前,先了解一下mysql多实例配置方案。mysql多实例的配置原则是:降低耦合性

[root@mysql ~]# tree -L 2 /data/
/data/
├── 3306
│   ├── data
│   ├── my.cnf
│   └── mysql
└── 3307
├── data
├── my.cnf
└── mysql

2.安装多实例MySQL数据库

2.1 创建MySQL多实例的数据文件目录

MySQL的安装上篇已经写了,这里就不再安装了。我们的数据文件目录采用的是/data目录作为mysql多实例总的根目录,然后规划不同的MySQL实例端口号来作为/data下面的二级目录,不同的端口号就是不同的实例目录以区别不同的实例,二级目录下包含mysql数据文件、配置文件以及启动文件的目录。

(1)创建相关mysql多实例的目录如下

#####我们先把安装的单实例mysql停掉,要不然会冲突
[root@mysql ~]# pkill mysqld
#####然后把之前安装的单实例mysql的启动文件删掉,以后就不用这个方法启动了
[root@mysql ~]# rm -f /etc/init.d/mysqld
提示:多实例mysql的安装和单实例mysql的安装在make && make install之后初始化数据库就不同了。
#####创建多实例目录,我们这里创建两个实例,如果想创建3个、4个同理往下增加即可。
[root@mysql ~]# mkdir -p /data/{3306,33307}/data
[root@mysql ~]# tree /data/
/data/ 总的多实例根目录
├── 3306            3306实例的目录
│   └── data        3306实例的数据文件目录
└── 3307            3307实例的目录
    └── data        3307实例的数据文件目录
4 directories, 0 files

2.2 创建MySQL多实例的配置文件

MySQL数据库默认为用户提供了多个配置文件模板,用户可以根据硬件配置大小来选择

[root@mysql mysql-5.5.32]# ls -l support-files/*.cnf
 -rw-r--r--. 1 root root  4723 1月  11 05:31 support-files/my-huge.cnf
 -rw-r--r--. 1 root root 19791 1月  11 05:31 support-files/my-innodb-heavy-4G.cnf
 -rw-r--r--. 1 root root  4697 1月  11 05:31 support-files/my-large.cnf
 -rw-r--r--. 1 root root  4708 1月  11 05:31 support-files/my-medium.cnf
 -rw-r--r--. 1 root root  2872 1月  11 05:31 support-files/my-small.cnf

上面是单实例的配置文件的默认配置文件模板,配置多实例就不同了,为了保证多实例之间彼此独立。因此,我们为每一个实例建立一个配置文件,一个启动文件,对应自己的数据文件。

在实际工作中可以拿早已修改好的模板来进行修改,通过rz命令等方式上传配置文件模板my.cnf文件。
我们在mysql安装包目录拷贝一个数据库文件重命名为my.cnf,然后将my.cnf内容清空,添加下面内容。下面是3306的配置文件,3307的配置文件要把my.cnf中的3306替换成3307,注意3307中的server-id值一定要修改,不能3306中的server-id一样。降配置文件放到/data/3306/目录下。配置文件如下所示:

[root@mysql ~]# cp /home/zbf/mysql-5.5.32/support-files/my-small.cnf /data/3306/my.cnf
[root@mysql 3306]# > my.cnf
[root@mysql 3306]# vim my.cnf
  1 [client]
  2 port= 3306
  3 socket  = /data/3306/mysql.sock
  4 [mysql]
  5 no-auto-rehash
  6 [mysqld]
  7 user= mysql
  8 port= 3306
  9 socket  = /data/3306/mysql.sock
 10 basedir = /usr/local/mysql
 11 datadir = /data/3306/data
 12 open_files_limit= 1024
 13 back_log = 600
 14 max_connections = 800
 15 max_connect_errors = 3000
 16 table_cache = 614
 17 external-locking = FALSE
 18 max_allowed_packet =8M
 19 sort_buffer_size = 1M
 20 join_buffer_size = 1M
 21 thread_cache_size = 100
 22 thread_concurrency = 2
 23 query_cache_size = 2M
 24 query_cache_limit = 1M
 25 query_cache_min_res_unit = 2k
 26 #default_table_type = InnoDB
 27 thread_stack = 192K
 #transaction_isolation = READ-COMMITTED
 29 tmp_table_size = 2M
 30 max_heap_table_size = 2M
 31 long_query_time = 1
 32 #log_long_format
 33 #log-error = /data/3306/error.log
 34 #log-slow-queries = /data/3306/slow.log
 35 pid-file = /data/3306/mysql.pid
 36 log-bin = /data/3306/mysql-bin
 37 relay-log = /data/3306/relay-bin
 38 relay-log-info-file = /data/3306/relay-log.info
 39 binlog_cache_size = 1M
 40 max_binlog_cache_size = 1M
 41 max_binlog_size = 2M
 42 expire_logs_days = 7
 43 key_buffer_size = 16M
 44 read_buffer_size = 1M
 45 read_rnd_buffer_size = 1M
 46 bulk_insert_buffer_size = 1M
 47 #InnoDB_sort_buffer_size = 1M
 48 #InnoDB_max_sort_file_size = 10G
 49 #InnoDB_max_extra_sort_file_size = 10G
 50 #InnoDB_repair_threads = 1
 51 #InnoDB_recover
 52 lower_case_table_names = 1
 53 skip-name-resolve
 54 slave-skip-errors = 1032,1062
 55 replicate-ignore-db=mysql
 56 server-id = 1
 57 innodb_additional_mem_pool_size = 4M
 58 innodb_buffer_pool_size = 32M
 59 innodb_data_file_path = ibdata1:128M:autoextend
 60 innodb_file_io_threads = 4
 61 innodb_thread_concurrency = 8
 62 innodb_flush_log_at_trx_commit = 2
 63 innodb_log_buffer_size = 2M
 64 innodb_log_file_size = 4M
 65 innodb_log_files_in_group = 3
 66 innodb_max_dirty_pages_pct = 90
 67 innodb_lock_wait_timeout = 120
 68 innodb_file_per_table = 0
 69 [mysqldump]
 70 quick
 71 max_allowed_packet = 2M
 [mysqld_safe]
 73 log-error=/data/3306/mysql_linzhongniao3306.err
 74 pid-file=/data/3306/mysqld.pid

2.3 创建启动文件

下面是3306实例的配置文件,配置3307实例的配置文件只需要把3306实例配置文件中的3306替换成3307。将启动文件放到/data/3306/目录下,启动文件如下所示:

#!/bin/bash
cmdPath="/usr/local/mysql/bin"
myPath="/data/3306"
softPath="/usr/local/mysql"
socketfile="$myPath/mysql.sock"
my_user="root"
my_pass="123456"  数据库设置的密码是多少这里就填多少
start(){
if [ ! -e "$socketfile" ];then
printf "Starting MySQL......\n"
/bin/sh   ${cmdPath}/mysqld_safe --defaults-file=${myPath}/my.cnf --user=mysql \
 --basedir=${softPath} --datadir=${myPath}/data &>/dev/null &
sleep 2
   else
printf "Mysqld is running....\n" && exit 1
   fi
}
stop(){
   if [ ! -e "$socketfile" ];then
printf "MySQL is stopped...\n"
        exit 1
   else
        printf "Stoping MySQL....\n"
        mysqladmin -u"${my_user}" -p"${my_pass}" \
   -S "$socketfile" shutdown 
    fi
}
restart(){
    printf "Restarting MySQL...\n"
stop
    sleep 2
start
}  
case "$1" in
   start)
start
   ;;
   stop)
stop
   ;;
   restart)
restart
   ;;
   *)
printf "Usage: $myPath/mysql {start|stop|restart}\n"
exit 1
esac

最终配置效果如下所示:

[root@mysql ~]# tree  /data
/data
├── 3306
│   ├── data
│   ├── my.cnf  3306实例的配置文件
│   └── mysql   3306实例的启动文件
└── 3307
    ├── data
    ├── my.cnf  3307实例的配置文件
    └── mysql   3307实例的启动文件

多实例启动文件启动mysql服务实质

[root@linzhongniao ~]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data 2>&1 >/dev/null &

多实例启动文件的平滑停止mysql服务实质

[root@linzhongniao ~]# /usr/local/mysql/bin/mysqladmin -uroot -p123456 -S /data/3306/mysql.sock shutdown

2.4 授权用户和组管理整个多实例目录/data

[root@mysql ~]# chown -R mysql.mysql /data
[root@mysql ~]# find /data/ -name mysql|xargs ls -l
 -rw-r--r--. 1 mysql mysql 1123 Oct 12 22:32 /data/3306/mysql
 -rw-r--r--. 1 mysql mysql 1252 Oct 12 22:19 /data/3307/mysql

2.5 授权mysql多实例服务所有启动文件mysql可执行

[root@mysql ~]# find /data -type f -name "mysql"|xargs ls -l
 -rw-r--r--. 1 mysql mysql 1604 1月  12 17:06 /data/3306/mysql
 -rw-r--r--. 1 mysql mysql 1604 1月  12 17:06 /data/3307/mysql
[root@mysql ~]# find /data -type f -name "mysql"|xargs chmod +x
[root@mysql ~]# find /data -type f -name "mysql"|xargs ls -l
 -rwxr-xr-x. 1 mysql mysql 1604 1月  12 17:06 /data/3306/mysql
 -rwxr-xr-x. 1 mysql mysql 1604 1月  12 17:06 /data/3307/mysql

2.6 配置MySQL命令全局使用路径

[root@mysql ~]# echo "export PATH=/usr/local/mysql/bin:$PATH" >>/etc/profile
[root@mysql ~]# tail -1 /etc/profile
export PATH=/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin/passwd:/usr/bin/passwd:/root/bin
[root@mysql ~]# source /etc/profile   

2.7 初始化MySQL多实例的数据库文件

(1)初始化命令

mysql5.1.X初始化命令

mysql_install_db --basedir=/usr/local/mysql/ --datadir=/data/3307/data/ --user=mysql
mysql_install_db --basedir=/usr/local/mysql/ --datadir=/data/3307/data/ --user=mysql

(2)mysql5.5.32初始化命令

[root@linzhongniao ~]# cd /usr/local/mysql/scripts/

要在scripts下执行,不在/usr/local/mysql/bin下。注意要在当前目录下执行加 ./。

[root@mysql scripts]# pwd
/usr/local/mysql/scripts
[root@mysql scripts]# ./mysql_install_db --basedir=/usr/local/mysql/ --datadir=/data/3306/data/ --user=mysql
Installing MySQL system tables...
OK
Filling help tables...
OK
..省略....
[root@mysql scripts]# ./mysql_install_db --basedir=/usr/local/mysql/ --datadir=/data/3307/data/ --user=mysql
Installing MySQL system tables...
OK
Filling help tables...
OK
...省略....

(3)为什么要初始化数据库?

a.初始化的主要目的就是创建基础的数据库文件,例如生成mysql库表。

b.初始化后可以查看对应的实例数据库目录,可以看到如下文件。

2.8 启动mysql服务

/data/3306/mysql start
/data/3307/mysql start

2.9 MySQL故障排错多实例数据库

如果mysql没有起来排查方法如下

(1)如果发现没有显示MySQL的端口,请等待几秒mysql服务启动会有点慢。

(2)如果还是不行,请查看错误日志,错误日志路径在my.cnf配置文件路径下面。

grep log-error /data/3306/mysql_linzhongniaao3306.err|tail -1

(3)细看所有执行命令返回的输出,不要忽略关键的输出结果。

(4)查看系统的/var/log/messages。

(5)如果是关联服务,要同时查看相关服务的LOG。

2.10 Mysql多实例登录

Mysql安装完成后,默认情况下管理员账号root是无密码的。登录不同的mysql数据库需要指定不同库的sock文件。如果是远程的话就指定IP地址。

[root@mysql ~]# mysql -S /data/3306/mysql.sock 
[root@mysql ~]# mysql -S /data/3307/mysql.sock 

3. MySQL安全配置

3.1 为root增加密码

mysqladmin -u root -S /data/3306/mysql.sock password '123456'
mysqladmin -u root -S /data/3307/mysql.sock password '123456'

设置完数据路密码登录数据库的方法

[root@mysql 3306]# mysql -uroot -p123456 -S /data/3306/mysql.sock
[root@mysql 3306]# mysql -uroot -p123456 -S /data/3307/mysql.sock

3.2 为mysql多实例启动脚本修改执行权限,只允许root用户有执行权限

[root@mysql ~]# find /data -type f -name "mysql" -exec ls -l {} \;
 -rwxr-xr-x. 1 mysql mysql 1267 Oct 12 23:01 /data/3307/mysql
 -rwxr-xr-x. 1 mysql mysql 1138 Oct 12 23:01 /data/3306/mysql
[root@mysql ~]# find /data -type f -name "mysql" -exec chown root.root {} \; 
[root@mysql ~]# find /data -type f -name "mysql" -exec chmod 700 {} \;   
[root@mysql ~]# find /data -type f -name "mysql" -exec ls -l {} \;  
 -rwx------. 1 root root 1267 Oct 12 23:01 /data/3307/mysql
 -rwx------. 1 root root 1138 Oct 12 23:01 /data/3306/mysql

至此mysql多实例配置完成