最近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命令往對應的實例中導入數據的時候,也需要加入這個參數,否則,就導入到默認的第一個實例裏面了
最後,作爲一個菜鳥,請各位大俠多多批評指正!