MySQL多實例部署與優化


MySQL安裝

 1 ##上傳MySQL安裝包##
 2 mkdir /home/oldboy/tools -p
 3 cd /home/oldboy/tools/
 4 ###wget -q http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.34.tar.gz 
 5 ####安裝依賴
 6 yum install ncurses-devel libaio-devel -y
 7 ###yum安裝cmake
 8 yum install cmake -y
 9 ###添加MySQL用戶
10 useradd -s /sbin/nologin -M mysql
11 id mysql
12 ####解壓MySQL安裝包
13 tar xf mysql-5.6.34.tar.gz
14 cd mysql-5.6.34
15 ####編譯
16 cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.34 \
17 -DMYSQL_DATADIR=/application/mysql-5.6.34/data \
18 -DMYSQL_UNIX_ADDR=/application/mysql-5.6.34/tmp/mysql.sock \
19 -DDEFAULT_CHARSET=utf8 \
20 -DDEFAULT_COLLATION=utf8_general_ci \
21 -DWITH_EXTRA_CHARSETS=all \
22 -DWITH_INNOBASE_STORAGE_ENGINE=1 \
23 -DWITH_FEDERATED_STORAGE_ENGINE=1 \
24 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
25 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
26 -DWITH_ZLIB=bundled \
27 -DWITH_SSL=bundled \
28 -DENABLED_LOCAL_INFILE=1 \
29 -DWITH_EMBEDDED_SERVER=1 \
30 -DENABLE_DOWNLOADS=1 \
31 -DWITH_DEBUG=0
32 echo $?
33 make && make install
34 echo $?
35 ln -s /application/mysql-5.6.34/ /application/mysql
36 ####初始化數據庫
37 cp support-files/my*.cnf /etc/my.cnf
38 /application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data --user=mysql
39 
40 cp support-files/mysql.server /etc/init.d/mysqld
41 chmod 700 /etc/init.d/mysqld
42 chkconfig mysqld on
43 chkconfig --list mysqld
44 
45 ##啟動數據庫
46 /etc/init.d/mysqld start
47 echo 'export PATH=/application/mysql/bin:$PATH' >>/etc/profile
48 tail -1 /etc/profile
49 source /etc/profile
50 echo $PATH
51 mysql
52 
53 ###出現問題查看日志
54 tail -100 /application/mysql/data/db01.err
55 
56 ###優化數據庫
57 ###設置密碼
58 mysqladmin -uroot -p password oldboy123
59 ###清理無用的庫,無用的用戶
60 show databases;
61 drop database test;
62 select user,host from mysql.user;
63 drop user 'root'@'::1';
64 select user,host from mysql.user;
65 drop user ''@'db01';
66 drop user 'root'@'db01';
67 drop user ''@'localhost';
68 select user,host from mysql.user;
69 #################以上單實例#####################
mysql的安裝

第1章 MySQL多實例配置

1.1 什么是MySQL多實例?

簡單地說,MySQL多實例就是在一台服務器上同時開啟多個不同的服務端口(如:3306,3307),同時運行多個MySQL服務進程,這些服務進程通過不同的socket監聽不同的服務端口來提供服務。

這些MySQL多實例共用一套MySQL安裝程序,使用不同的my.cnf(也可以相同)配置文件、啟動程序(也可以相同)和數據文件。在提供服務時,多實例MySQL在邏輯上看來是各自獨立的,它們根據配置文件的對應設定值,獲得服務器相應數量的硬件資源。

打個比方吧,MySQL多實例就相當於房子的多個卧室,每個實例可以看作一間卧室,整個服務器就是一套房子,服務器的硬件資源(cpu,men,disk)、軟件資源(CentOS操作系統)可以看作房子的衛生間、廚房、客廳,是房子的共用資源。若你是北漂的小伙伴,與朋友一起租房子,相信更好理解,大家蝸居在一起,休息在自己的卧室,出來活動肯定是要共用上述公共資源。這樣就可以很好的理解MySQL多實例了。

 

其實很多網絡服務都是可以配置多實例的,例如nginx、Apache、haproxy、redis等都可以配置多實例。這在門戶網站使用都很廣泛。

1.2 MySQL多實例的作用於問題

  • 有效利用服務器資源

當單個服務器資源有剩余時,可以充分利用剩余的資源提供更多的服務,且可以實現資源的邏輯隔離。

  • 節約服務器資源

當公司資金緊張,但是數據庫又需要各自盡量獨立地提供服務,而且,需要主從復制等技術,多實例就再好不過了。

MySQL多實例有它的好處,但也有其弊端,比如,會存在資源互相搶占的問題。

當某個數據庫實例並發很高或者有SQL慢查詢時,整個實例會消耗大量的系統CPU、磁盤I/O等資源,導致服務器上的其他數據庫實例提供服務的質量一起下降。這就相當於大家住在一個房子的不同卧室一樣,早晨起來上班,都要刷牙、洗臉等,這樣衛生間就會長期占有,其他人就要等待一樣。不同實例獲取的資源是相對獨立的,無法像虛擬化一樣完全隔離。

1.3 MySQL多實例的生產應用場景

1、資金緊張型公司的選擇

若公司資金緊張,公司業務訪問量又不是太大,但又希望不同業務的數據庫服務各自盡量獨立地提供服務而互相不受影響,同時,還需要主從復制等技術提供備份或讀寫分離服務,那么,多實例就再好不過了。比如:可以通過3台服務器部署9~15個實例,交叉做主從復制、數據備份及讀寫分離,這樣就可以達到9~15台服務器每個只裝一個數據庫才有的效果。這里要強調的是,所謂的盡量獨立是相對的。

2、並發訪問不是特別大的業務

當公司業務訪問量不太大的時候,服務器的資源基本都是浪費的,這時就很適合多實例的應用,如果對SQL語句的優化做得比較好,MySQL多實例會是一個很值得使用的技術,即使並發很大,合理分配好系統資源以及搭配好服務,也不會有太大問題。

3、門戶網站應用MySQL多實例場景

    門戶網站通常都會使用多實例,因為配置硬件好的服務器,可節省IDC機櫃空間,同時,跑多實例也會減少硬件資源跑不滿的浪費。比如:百度公司的很多數據庫都是多實例,不過,一般是從庫多實例,例如某部門使用的IBM服務器為48核CPU,內存96GB,一台服務器跑3~4個實例;此外,sina網也是用的多實例,內存48GB左右。

說明:據調查,sina網的數據庫單機1~4個數據庫實例的居多,其中又數1~2個的最多,因為大業務占用的機器比較多。服務器是DELL R510的居多,CPU是E5210,48GB內存,磁盤12*300GSAS,做RAID10,此為門戶網站的服務器配置參考。

    另外,sina網站安裝數據庫時,一般采用編譯安裝的方式,並且會在進行優化之后做rpm包,以便統一使用。

1.4 配置MySQL多實例

上傳文件地址:

鏈接:https://pan.baidu.com/s/14nfi-bHweexKO5dJAoZyMA 密碼:nmko

 1 ##關閉單實例,跟多實例端口有沖突
 2 /etc/init.d/mysqld stop
 3 chkconfig mysqld off
 4 chkconfig --list|grep mys
 5 ####創建目錄##
 6 mkdir -p /data/{3306,3307}/data
 7 ###上傳配置文件到根下,並解壓###
 8  
 9 chown -R mysql.mysql /data/
10 find /data -name mysql
11 find /data -name mysql|xargs chmod 700
12 find /data -name mysql|xargs ls -l
13 ####初始化數據庫
14 cd /application/mysql/scripts
15 ./mysql_install_db  --defaults-file=/data/3306/my.cnf --basedir=/application/mysql --datadir=/data/3306/data --user=mysql
16 ./mysql_install_db  --defaults-file=/data/3307/my.cnf --basedir=/application/mysql --datadir=/data/3307/data --user=mysql
17 ####配置環境變量###
18 #echo 'export PATH=/application/mysql/bin:$PATH' >>/etc/profile
19 #source  /etc/profile
20 ####啟動數據庫###
21 /data/3306/mysql start
22 /data/3307/mysql start
23 netstat -lntup|grep 330
24 ###登錄數據庫####
25 mysql -S /data/3306/mysql.sock 
26 mysql -S /data/3307/mysql.sock
多實例

1.5 增加一個實例3308

 1 ####增加一個實例3308####
 2 mkdir -p /data/3308/data
 3 
 4 cd /data/3308
 5 vim my.cnf
 6 [client]
 7 port            = 3308
 8 socket          = /data/3308/mysql.sock
 9 
10 [mysql]
11 no-auto-rehash
12 
13 [mysqld]
14 user    = mysql
15 port    = 3308
16 socket  = /data/3308/mysql.sock
17 basedir = /application/mysql
18 datadir = /data/3308/data
19 open_files_limit    = 1024
20 back_log = 600
21 max_connections = 800
22 max_connect_errors = 3000
23 table_open_cache = 614
24 external-locking = FALSE
25 max_allowed_packet =8M
26 sort_buffer_size = 1M
27 join_buffer_size = 1M
28 thread_cache_size = 100
29 thread_concurrency = 2
30 query_cache_size = 2M
31 query_cache_limit = 1M
32 query_cache_min_res_unit = 2k
33 #default_table_type = InnoDB
34 thread_stack = 192K
35 #transaction_isolation = READ-COMMITTED
36 tmp_table_size = 2M
37 max_heap_table_size = 2M
38 #long_query_time = 1
39 #log_long_format
40 #log-error = /data/3308/error.log
41 #log-slow-queries = /data/3308/slow.log
42 pid-file = /data/3308/mysql.pid
43 #log-bin = /data/3308/mysql-bin
44 relay-log = /data/3308/relay-bin
45 relay-log-info-file = /data/3308/relay-log.info
46 binlog_cache_size = 1M
47 max_binlog_cache_size = 1M
48 max_binlog_size = 2M
49 expire_logs_days = 7
50 key_buffer_size = 16M
51 read_buffer_size = 1M
52 read_rnd_buffer_size = 1M
53 bulk_insert_buffer_size = 1M
54 lower_case_table_names = 1
55 skip-name-resolve
56 slave-skip-errors = 1032,1062
57 replicate-ignore-db=mysql
58 server-id = 8
59 innodb_additional_mem_pool_size = 4M
60 innodb_buffer_pool_size = 32M
61 innodb_data_file_path = ibdata1:128M:autoextend
62 innodb_file_io_threads = 4
63 innodb_thread_concurrency = 8
64 innodb_flush_log_at_trx_commit = 2
65 innodb_log_buffer_size = 2M
66 innodb_log_file_size = 4M
67 innodb_log_files_in_group = 3
68 innodb_max_dirty_pages_pct = 90
69 innodb_lock_wait_timeout = 120
70 innodb_file_per_table = 0
71 [mysqldump]
72 quick
73 max_allowed_packet = 2M
74 
75 [mysqld_safe]
76 log-error=/data/3308/oldboy_3308.err
77 pid-file=/data/3308/mysqld.pid
增加一個實例3308
 1 vim mysql
 2 #!/bin/sh
 3 ################################################
 4 #this scripts is created by oldboy at 2007-06-09
 5 #oldboy QQ:31333741
 6 #site:http://www.etiantian.org
 7 #blog:http://oldboy.blog.51cto.com
 8 #oldboy trainning QQ group: 208160987 226199307  44246017
 9 ################################################
10 #init
11 port=3308
12 mysql_user="root"
13 mysql_pwd="oldboy123"
14 CmdPath="/application/mysql/bin"
15 mysql_sock="/data/${port}/mysql.sock"
16 start(){
17     if [ ! -e "$mysql_sock" ];then
18          printf "Starting MySQL...\n"
19         /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
20     else
21         printf "MySQL is running...\n"
22         exit 1
23     fi
24 }
25 stop(){
26     if [ ! -e "$mysql_sock" ];then
27         printf "MySQL is stopped...\n"
28         exit 1
29     else
30         printf "Stoping MySQL...\n"
31         ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
32     fi
33 }
34 
35 restart(){
36     printf "Restarting MySQL...\n"
37     stop
38     sleep 2
39     start
40 }
對應腳本

1.6 快速增加一個實例3308

 1 ####快速增加實例####
 2 mkdir -p /data/3308/data
 3 \cp /data/3306/my.cnf  /data/3308/
 4 \cp /data/3306/mysql  /data/3308/
 5 sed -i 's/3306/3308/g' /data/3308/my.cnf 
 6 sed -i 's/server-id = 6/server-id = 8/g' /data/3308/my.cnf 
 7 sed -i 's/3306/3308/g' /data/3308/mysql
 8 chown -R mysql:mysql /data/3308
 9 chmod 700 /data/3308/mysql
10 cd /application/mysql/scripts
11 ./mysql_install_db --defaults-file=/data/3308/my.cnf --datadir=/data/3308/data --basedir=/application/mysql --user=mysql
12 chown -R mysql:mysql /data/3308
13 egrep "server-id|log-bin" /data/3308/my.cnf 
14 /data/3308/mysql start
15 sleep 5
16 netstat -lnt|grep 3308
View Code

1.7 為數據庫設置密碼

1 ####
2 mysqladmin -uroot -p password oldboy123 -S /data/3308/mysql.sock
3 mysqladmin -uroot -p password oldboy123 -S /data/3307/mysql.sock
4 mysqladmin -uroot -p password oldboy123 -S /data/3306/mysql.sock
View Code

1.8 MySQL關閉優化

 1 ####優化關閉MySQL####
 2 [root@db01 3306]# cat /data/3306/mysql_oldboy
 3 #!/bin/sh
 4 #init
 5 port=3306
 6 mysql_user="root"
 7 mysql_pwd="oldboy123"
 8 CmdPath="/application/mysql/bin"
 9 mysql_sock="/data/${port}/mysql.sock"
10 mysqld_pid_file_path=/application/mysql/3306.pid
11 start(){
12     if [ ! -e "$mysql_sock" ];then
13          printf "Starting MySQL...\n"
14         /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
15         sleep 3
16     else
17         printf "MySQL is running...\n"
18         exit 1
19     fi
20 }
21 stop(){
22     if [ ! -e "$mysql_sock" ];then
23         printf "MySQL is stopped...\n"
24         exit 1
25     else
26         printf "Stoping MySQL...\n"
27         mysqld_pid=`cat "$mysqld_pid_file_path"`
28          if (kill -0 $mysqld_pid 2>/dev/null)
29            then
30              kill $mysqld_pid
31              sleep 2
32          fi
33     fi
34 }
35 
36 restart(){
37     printf "Restarting MySQL...\n"
38     stop
39     sleep 2
40     start
41 }
42 
43 case "$1" in
44     start)
45         start
46     ;;
47     stop)
48         stop
49     ;;
50     restart)
51         restart
52     ;;
53     *)
54         printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
55 esac
56 
57 sh -x /data/3306/mysql_oldboy stop
優化

1.9 不用密碼登錄配置

 1 ###以前面配置的單實例MySQL為例
 2 ###不用密碼登錄
 3 [root@db01 3306]# head /etc/my.cnf
 4 # For advice on how to change settings please see
 5 # http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
 6 # *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
 7 # *** default location during install, and will be replaced if you
 8 # *** upgrade to a newer version of MySQL.
 9 [client]          
10 user=root         
11 password=oldboy123
12 [root@db01 3306]# chmod 700 /etc/my.cnf
/etc/my.cnf文件

1.10 數據庫管理

#####數據庫管理###

help contents; #查看幫助,help可以用?替代

Account Management

賬戶管理

Administration

管理

Compound Statements

復合語句

Data Definition

數據定義

Data Manipulation

數據操作

Data Types

數據類型

Functions

函數

Functions and Modifiers for Use with GROUP BY

與GROUP BY相關的函數和修飾符

Geographic Features

地理特征

Help Metadata

幫助元數據

Language Structure

語言結構

Plugins

插件

Procedures

存儲過程

Storage Engines

存儲引擎

Table Maintenance

表維護

Transactions

事務處理

User-Defined Functions

用戶自定義函數

Utility

實用程序

 

1.11 MySQL密碼忘記找回

1 ###MySQL密碼忘記####
2 mysqld_safe --skip-grant-tables --user=mysql &
3 #mysqld_safe --defaults-file=/data/3307/my.cnf --skip-grant-tables >/dev/null 2>&1 &
4 mysql
5 #用戶@主機    唯一標識
6 mysql> update mysql.user set password=PASSWORD('old') where user='root' and host='localhost';
7 mysql> flush privileges;
8 /etc/init.d/mysqld stop
9 /etc/init.d/mysqld start
MySQL密碼忘記

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM