MySQL多實例
1、什么是MySQL多實例
簡單地說,Mysql多實例就是在一台服務器上同時開啟多個不同的服務端口(3306、3307),同時運行多個Mysql服務進程,這些服務進程通過不同的socket監聽不同的服務端口來提供服務。
這些Mysql多實例公用一套Mysql安裝程序,使用不同的my.cnf(也可以相同)配置文件,啟動程序(也可以相同)和數據文件。在提供服務時,多實例 Mysql在邏輯上看來是各自獨立的,它們根據配置文件的對應設定值,獲得服務器相應數量的硬件資源。
打個比方,Mysql多實例就相當於房子的多個卧室,每個實例可以看作一間卧室,整個服務器就是一套房子,服務器的硬件資源(cpu、mem、disk)、軟件資源(centos操作系統)可以看作房子的衛生間、客廳,是房子的公用資源。
MySQL多實例示意圖
2、多實例的作用與問題
Mysql多實例作用:
l 有效利用服務器資源
當單個服務器資源有剩余時,可以充分利用剩余的資源提供更多的服務,且可以實現資源的邏輯隔離。
l 節約服務器資源
當公司資金緊張,但是數據庫又需要各自盡量獨立的提供服務,而且需要主從復制等技術時,多實例就再好不過了。
Mysql多實例有它的好處,但也有弊端,比如會存在資源互相搶占的問題。
當某個數據庫實例並發很高或者有SQL慢查詢時,整個實例會消耗大量的系統CPU、磁盤I/O等資源,導致服務器上的其他數據庫實例提供服務的質量一起下降。不同實例獲取的資源是相互獨立的,無法像虛擬化一樣完全隔離。
3、Mysql多實例應用場景
1、資金緊張型公司的選擇
若公司資金緊張,公司業務訪問量又不是太大,但有希望不同業務的數據庫服務各自盡量獨立的提供服務而互相不受影響,同時,還需要主從復制等技術提供備份或讀寫分離服務,那么多實例就再好不過了,比如:可以3台服務器部署9~15個實例,交叉做主從復制、數據備份及讀寫分離,這樣就可達到9~15台服務器每個只裝一個數據庫才有的效果,這里要強調的是所謂的盡量獨立是相對的。
2、並發訪問不是特別大的業務
當公司業務訪問量不太大的時候,服務器的資源基本都是浪費的,這時就很適合多實例的應用,如果對SQL語句的優化做的比較好,Mysql多實例會是一個很值得使用的技術,即使並發很大,合理的分配好系統資源以及搭配好服務,也不會有太大問題。
3、門戶網站應用Mysql多實例場景
門戶網站通常都會使用多實例,因為配置硬件好的服務器,可以節省IDC機櫃空間,同時跑多實例也會減少硬件資源跑不滿的浪費。比如,百度公司的很多數據庫都是多實例,不過一般是從庫多實例。例如某部門中使用的IBM服務器為48核CPU,內存96GB,一台服務器排3-4個實例,此外,新浪網也是多實例,內存48GB左右。
說明:新浪的數據庫單機1-4個數據庫實例的居多。其中又數1~2個的最多,因為大業務的機器比較多。服務器是DELL R510的居多,CPU是E5210,48GB內存,磁盤是 12 *300GB SAS,做的RAID10。
4、Mysql多實例常見的配置方案
4.1、單一的配置文件、單一啟動程序多實例部署方案
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
該方案的缺點是耦合度高。所以一般我們應該下面的方案。
4.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目錄也是獨立的。
5、安裝並配置多實例Mysql數據庫
5.1、安裝Mysql多實例
1、安裝Mysql需要的依賴包和編譯軟件
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。
2、開始安裝Mysql
為了學習更多的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方式的安裝就算成功了。
5.2、創建Mysql多實例的數據文件目錄
不同的企業中,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多實例的配置文件以及啟動文件,不過我們還是按照步驟來介紹下正常配置多實例。
5.3、創建多實例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
5.4、創建mysql多實例的啟動文件
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實現的。
5.5、配置mysql多實例文件的權限
授權多實例的根目錄屬主屬組和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
5.6、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命令不是一個,進而產生錯誤。
5.7、初始化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)初始化錯誤集錦
5.8、啟動Mysql多實例
[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
5.9、多實例數據庫啟動停止原理
多實例停止原理:
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 &
這里只是我們編寫的腳本是實現的原理。
5.10、多實例啟動錯誤排錯說明
l 多實例MYSQL的啟動比WEB稍微慢一點,所以不要啟動后馬上查看端口,沒有就以為是失敗。
l 學會看日志,多實例的日志路徑在my.cnf最后一行定義了:
[mysqld_safe]
log-error=/data/3306/mysql_oldboy3306.err
6、配置及管理Mysql多實例數據庫
1、配置MYSQL多實例數據庫開機自啟動
echo "/data/3306/mysql start" >>/etc/rc.local
echo "/data/3307/mysql start" >>/etc/rc.local
2、登錄MYSQL測試
MYSQL多實例的登錄需要指定sock文件。不同實例的sock文件不同。
[root@db01 scripts]# mysql -S /data/3306/mysql.sock
3、MYSQL多實例數據庫的管理方法
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
4、MYSQL簡單安全配置
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)
5、如何再增加一個MYSQL的實例
如果已經有了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
6、多實例MYSQL登錄問題分析
1)本地多實例登錄MYSQL
多實例本地登登錄一般是通過socket文件指定具體登錄到哪一個實例的,此文件的具體位置是在mysql編譯過程或者my.cnf文件里指定的,在本地登錄數據庫時,登錄程序會通過socket文件來判斷登錄的是哪個數據庫實例。
例如:通過
mysql –uroot –p’oldboy123’ –S /data/3307/mysql.sock
可知,登錄的是3307這個實例。mysql.sock 文件是mysql服務端與本地MYSQL客戶端進行通信的UNIX套接字文件。
2)遠程連接登錄MYSQL多實例
遠程登錄MYSQL多實例的一個實例時,通過TCP端口(port)來指定所要登錄的MYSQL實例,此端口的配置是在MYSQL配置文件my.cnf中指定的。
例如:
mysql –uroot –p’oldboy’ –h 10.0.0.7 –P 3307
其中-P為端口參數,后面接具體的實例端口,端口是一種“邏輯連接位置”,是客戶端程序被分派到計算機上特殊服務程序的一種方式,強調提前在10.0.0.7上對oldboy用戶授權。
7、MYSQL基礎安全優化
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
8、小結
面試題
1、什么是mysql多實例,如何配置
2、mysql基礎安全優化