最近mysql数据库遇到了几个问题:
由于多个应用使用的是同一个数据库实例,当其中一个应用由于sql问题卡死的时候,导致其他应用也被连累的宕机了
公司有多个产品,其中一个产品的数据库要求大小写不区分,但是如果给他不区分之后,其他应用的数据库是要求必须区分的
某产品是公司的主打产品,它使用了4个数据库,都放在一个实例下,但是有一个数据库是用来保存接口访问日志的,并且后台会对这些数据进行分析,平时运行的还正常。突然有一天,直接卡死了,导致这个应用无法登陆,无法访问了。后来分析原因,有个sql无法命中索引,导致数据库卡死!
由于经验的缺乏,导致了以上各种问题的发生,后来考虑到这台服务器资源还很充足,就考虑用多实例解决这个问题。以下是我搭建多实例的过程。
操作系统:centos6.5 64位
mysql版本:mysql-5.5.42
使用yum安装一些依赖包
yum -y install gcc gcc-c++ zlib* ncurses-devel libmcrypt* libtool-ltdl-devel* openssl pcre* telnet sysstat mlocate bison cmake
groupadd mysql useradd -g mysql mysql mkdir -p /data/3307mysql/{server,data} mkdir -p /data/3308mysql/{server,data} mkdir -p /data/3309mysql/{server,data}修改mysql数据目录的权限,以保证mysql正常启动
chown -R mysql.mysql /data/3307mysql chown -R mysql.mysql /data/3308mysql chown -R mysql.mysql /data/3309mysql编译安装mysql
cd /usr/src tar -zxvf mysql-5.5.42.tar.gz cd mysql-5.5.42 cmake . -DCMAKE_INSTALL_PREFIX=/data/3309mysql/server -DMYSQL_DATADIR=/data/3309mysql/data -DMYSQL_UNIX_ADDR=/data/3309mysql/mysqld.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_TCP_PORT=3309 -DEXTRA_CHARSETS=all \-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_USER=mysql -DWITH_DEBUG=1 make make install cmake . -DCMAKE_INSTALL_PREFIX=/data/3308mysql/server -DMYSQL_DATADIR=/data/3308mysql/data -DMYSQL_UNIX_ADDR=/data/3308mysql/mysqld.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_TCP_PORT=3308 -DEXTRA_CHARSETS=all \-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_USER=mysql -DWITH_DEBUG=1 make make install cmake . -DCMAKE_INSTALL_PREFIX=/data/3307mysql/server -DMYSQL_DATADIR=/data/3307mysql/data -DMYSQL_UNIX_ADDR=/data/3307mysql/mysqld.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_TCP_PORT=3307 -DEXTRA_CHARSETS=all \-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_USER=mysql -DWITH_DEBUG=1 make make install复制my.cnf到指定的位置
cd /data/3307mysql/server cp support-files/my-innodb-heavy-4G.cnf ./my.cnf cd /data/3308mysql/server cp support-files/my-innodb-heavy-4G.cnf ./my.cnf cd /data/3309mysql/server cp support-files/my-innodb-heavy-4G.cnf ./my.cnf准备各个实例的启动脚本
#3307数据库启动脚本 #!/bin/bash #author:sqw 2015年6月5日 mysql_port=3307 mysql_username="root" mysql_password="123qwe" mysql_safe="/data/3307mysql/server/bin/mysqld_safe" mysql_cnf="/data/3307mysql/server/my.cnf" mysql_sock="/data/3307mysql/mysql.sock" function_start_mysql() { printf "Starting MySQL...\n" /bin/sh ${mysql_safe} --defaults-file=${mysql_cnf} 2>&1 > /dev/null & printf "Starting MySQL...success!\n" } function_stop_mysql() { printf "Stoping MySQL...\n" /data/3307mysql/server/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S ${mysql_sock} shutdown 2>/dev/null printf "Stoping MySQL...success!\n" } function_kill_mysql() { kill -9 $(ps -ef | grep '3307mysql/server' |grep -v grep| grep -v mysqld_safe| awk '{print $2}') kill -9 $(ps -ef | grep '3307mysql/server' |grep -v grep| awk '{print $2}') } function_restart_mysql() { printf "Restarting MySQL...\n" function_stop_mysql function_start_mysql } case $1 in start) function_start_mysql;; stop) function_stop_mysql;; kill) function_kill_mysql;; restart) function_stop_mysql function_start_mysql;; *) echo "Usage: /data/3307mysql/my3307.sh {start|stop|restart|kill} ------start 启动 ------stop 停止 ------restart 重启 ------kill 强制杀掉进程 ";; esac #mysql3308启动脚本 #!/bin/bash #author:sqw 2015年6月5日 mysql_port=3308 mysql_username="root" mysql_password="123qwe" mysql_safe="/data/3308mysql/server/bin/mysqld_safe" mysql_cnf="/data/3308mysql/server/my.cnf" mysql_sock="/data/3308mysql/mysql.sock" function_start_mysql() { printf "Starting MySQL...\n" /bin/sh ${mysql_safe} --defaults-file=${mysql_cnf} 2>&1 > /dev/null & printf "Starting MySQL...success!\n" } function_stop_mysql() { printf "Stoping MySQL...\n" /data/3308mysql/server/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S ${mysql_sock} shutdown 2>/dev/null printf "Stoping MySQL...success!\n" } function_kill_mysql() { kill -9 $(ps -ef | grep '3308mysql/server' |grep -v grep| grep -v mysqld_safe| awk '{print $2}') kill -9 $(ps -ef | grep '3308mysql/server' |grep -v grep| awk '{print $2}') } function_restart_mysql() { printf "Restarting MySQL...\n" function_stop_mysql function_start_mysql } case $1 in start) function_start_mysql;; stop) function_stop_mysql;; kill) function_kill_mysql;; restart) function_stop_mysql function_start_mysql;; *) echo "Usage: /data/3308mysql/my3308.sh {start|stop|restart|kill} ------start 启动 ------stop 停止 ------restart 重启 ------kill 强制杀掉进程 ";; esac #mysql3309数据库启动脚本 #!/bin/bash #author:sqw 2015年6月5日 mysql_port=3309 mysql_username="root" mysql_password="123qwe" mysql_safe="/data/3309mysql/server/bin/mysqld_safe" mysql_cnf="/data/3309mysql/server/my.cnf" mysql_sock="/data/3309mysql/mysql.sock" function_start_mysql() { printf "Starting MySQL...\n" /bin/sh ${mysql_safe} --defaults-file=${mysql_cnf} 2>&1 > /dev/null & printf "Starting MySQL...success!\n" } function_stop_mysql() { printf "Stoping MySQL...\n" /data/3309mysql/server/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S ${mysql_sock} shutdown 2>/dev/null printf "Stoping MySQL...success!\n" } function_kill_mysql() { kill -9 $(ps -ef | grep '3309mysql/server' |grep -v grep| grep -v mysqld_safe| awk '{print $2}') kill -9 $(ps -ef | grep '3309mysql/server' |grep -v grep| awk '{print $2}') } function_restart_mysql() { printf "Restarting MySQL...\n" function_stop_mysql function_start_mysql } case $1 in start) function_start_mysql;; stop) function_stop_mysql;; kill) function_kill_mysql;; restart) function_stop_mysql function_start_mysql;; *) echo "Usage: /data/3309mysql/my3309.sh {start|stop|restart|kill} ------start 启动 ------stop 停止 ------restart 重启 ------kill 强制杀掉进程 ";; esac初始化各个实例
cd /data/3309mysql/server bash scripts/mysql_install_db --user=mysql --basedir=/data/3309mysql/server --datadir=/data/3309mysql/data cd /data/3308mysql/server bash scripts/mysql_install_db --user=mysql --basedir=/data/3308mysql/server --datadir=/data/3308mysql/data cd /data/3307mysql/server bash scripts/mysql_install_db --user=mysql --basedir=/data/3307mysql/server --datadir=/data/3307mysql/data修改各个数据库实例的root密码
bash /data/3307mysql/my3307.sh start bash /data/3308mysql/my3308.sh start bash /data/3309mysql/my3309.sh start /data/3307mysql/server/bin/mysqladmin -u root -S /data/3307mysql/mysqld.sock password '123qwe' /data/3307mysql/server/bin/mysqladmin -u root -S /data/3308mysql/mysqld.sock password '123qwe' /data/3307mysql/server/bin/mysqladmin -u root -S /data/3309mysql/mysqld.sock password '123qwe'登录各个实例查看是否可以正常使用
mysql -uroot -p123qwe -S /data/3307mysql/mysqld.sock mysql -uroot -p123qwe -S /data/3308mysql/mysqld.sock mysql -uroot -p123qwe -S /data/3309mysql/mysqld.sock
OK,到此为止,3307,3308,3309这三个实例已经建立完成,可以把哪些需要分割的数据库单独转移过来了。
不过,还有几个问题需要注意:
1、登录的时候请注意加参数
-S /data/3307mysql/mysqld.sock
选对对应的sock文件,才能正常登录到对应的实例中
2、使用mysql命令往对应的实例中导入数据的时候,也需要加入这个参数,否则,就导入到默认的第一个实例里面了
最后,作为一个菜鸟,请各位大侠多多批评指正!