mysql基礎

1. MySQL數據庫介紹

1.1 MySQL介紹

MySQL屬於傳統關係型數據庫產品,它開放式的架構使得用戶選擇性很強,同時社區開發與維護人數衆多。其功能穩定,性能卓越,且在遵守GPL協議的前提下,可以免費使用與修改,也爲MySQL的推廣與使用帶來了更多的利好。在MySQL成長與發展過程中,支持的功能逐漸增多,性能也不斷提高,對平臺的支持也越來越多。

MySQL是一種關係型數據庫管理系統,關係型數據庫的特點是將數據保存在不同的表中,再將這些表放入不同的數據庫中,而不是將所有數據統一放在一個大倉庫裏,這樣的設計增加了MySQL的讀取速度,而且靈活性和可管理性也得到了很大提高。訪問及管理MySQL數據庫的最常用標準化語言爲SQL結構化查詢語言。

1.2 MariaDB數據庫的誕生背景介紹

自甲骨文公司收購MySQL後,其在商業數據庫與開源數據庫領域市場的佔有份額都躍居第一,這樣的格局引起了業內很多的人士的擔憂,因爲商業數據庫的老大有可能將MySQL閉源。爲了避免Oracle將MySQL閉源,而無開源的類MySQL數據庫可用,MySQL社區採用分支的方式來避開這個風險。MariaDB數據庫就這樣誕生了,MariaDB是一個向後兼容,可能在以後替代MySQL的數據庫產品,其官方地址爲https://mariadb.org/。不過,這裏還是建議大家選擇更穩定、使用更廣泛的MySQL數據庫,可以先測試MariaDB數據庫,等使用的人員更多一些,社區更活躍後再考慮使用爲好。

1.3 什麼是MySQL多實例

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

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

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

其實很多網絡服務都是可以配置多實例的,例如Nginx、Apache、Haproxy、Redis、Memcahe等。這在門戶網站使用得很廣泛。

1.4 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×300G SAS,做RAID10,此爲門戶網站的服務器配置參考,希望能給讀者購買服務器及部署實例一點數據幫助。

另外,新浪網站安裝數據庫時,一般採用編譯安裝的方式,並且做成rpm包,以便統一使用。


2. MySQL數據庫源碼安裝

  • 安裝版本:mysql-5.5.49

2.1 MySQL數據庫源碼編譯安裝

1. 安裝相關包cmake軟件和ncurses包

yum -y install cmake ncurses-devel
rpm -qa cmake ncurses-devel


2. 創建MySQL數據庫管理用戶mysql

useradd mysql -M -s /sbin/nologin


3. 創建軟件存放目錄

mkdir -p /home/oldboy/tools
cd /home/oldboy/tools


3. 上傳mysql軟件包解壓並編譯

rz     ---源碼包
tar xf 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 && make install


4. 爲mysql創建一個lilk(軟連接),工作常用

ln -s /application/mysql-5.5.49/ /application/mysql
ll /application/


5. 授權mysql用戶管理數據庫

cd /application/mysql
chown -R mysql.mysql /application/mysql*



6. 初始化數據庫

 ./scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data/ --user=mysql


7. 啓動數據庫

cd /application/mysql
\cp support-files/my-small.cnf /etc/my.cnf
sed -i 's#/usr/local/#/application/#g' /etc/my.cnf
/application/mysql/bin/mysqld_safe --user=mysql &     
#<== 啓動數據庫命令
lsof -i :3306

#<== 執行以上四步,先使用cp將mysql配置文件放到/etc下面,然後在啓動檢查即可。
echo "/application/mysql/bin/mysqld_safe --user=mysql &" >>/etc/rc.local
            #<== 加入開機自啓動


8. 將mysql命令加入PATS變量

PATH="/application/mysql/bin:$PATH"
echo $PATH
echo 'PATH="/application/mysql/bin:$PATH"' >>/etc/profile
tail 6 /etc/profile
source /etc/profile

 # 如果不配置mysql的全局路徑,則無法使用直接敲mysql等命令管理數據庫,而只能採用/application/mysql/bin/mysql)全路徑執行才行,將重新定義的PATH第一條命令加入到/etc/profile裏面,永久生效(新加變量要放到前面)

----------------現在就可以直接輸入命令進入數據庫啦!!!-----------------
[root@nfs01 mysql]# mysql
Welcome to the MySQLmonitor.  Commands end with ; or \g.
Your MySQLconnection id is 2
Server version:5.5.49 Source distribution
Copyright (c) 2000,2016, Oracle and/or its affiliates. All rights reserved.
Oracle is aregistered trademark of Oracle Corporation and/or its
affiliates. Othernames may be trademarks of their respective
owners.
Type 'help;' or '\h'for help. Type '\c' to clear the current input statement.
mysql>   
      --------成功!!!!


2.2 MySQL多實例添加

環境:接着本章節2.1環境安裝多實例

說明:因爲mysql數據的默認端口爲3306,現在我們要增加多實例,所以端口和路徑也要相應的做下改變,方便管理,安裝兩個多實例:端口爲3307和3308;配置文件的路徑爲:/data/{3307,3308}

 

1. 創建多實例數據庫目錄並授權

mkdir -p /data/{3307,3308}/data/
chown -R mysql.mysql /data/


2. 在根下上傳多實例的配置文件

cd /
rz (多實例啓動命令文件和配置文件)
unzip data.zip      #<== 此壓縮包解壓後會在/data/{3307,3308}目錄下生成my.cnf(配置文件),mysql(啓動                                       命令),以及一些日誌文件等!
chown -R mysql.mysql /data/330*   #<== 對解壓後生成的配置文件授權


3. 初始化多實例數據庫

cd /application/mysql/scripts/

./mysql_install_db --basedir=/application/mysql/ --datadir=/data/3307/data/ --user=mysql
 
#<== 初始化端口爲3307的數據庫目錄

./mysql_install_db --basedir=/application/mysql/ --datadir=/data/3308/data/ --user=mysql
#<== 初始化端口爲3308的數據庫目錄


3. 授權兩個多實例3307和3308啓動命令授權

[root@nfs01 data]# chown -R mysql.mysql /data  
[root@nfs01 data]# find /data -type f -name "mysql"
/data/3307/mysql
/data/3308/mysql
[root@nfs01 data]# find /data -type f -name "mysql"|xargs chmod +x
[root@nfs01 data]# ls *
3307:
my.cnf 
 
3308:
my.cnf


4. 啓動多實例數據庫

/data/3307/mysql start
/data/3308/mysql start
[root@nfs01 3307]# ss -lntup|grep 330                               
tcp    LISTEN  0   50    *:     *:*     users:(("mysqld",29124,10))
tcp    LISTEN  0   600   *:     *:*     users:(("mysqld",28194,11))
tcp    LISTEN  0   600   *:     *:*     users:(("mysqld",22822,12))
echo "data/3307/mysql start" >>/etc/rc.local   
echo "data/3308/mysql start" >>/etc/rc.local   
tail -2 /etc/rc.local

說明:如果某個端口沒有起來,可以查看該端口下的配置的日誌文件:mysql_oldboy3307.err


5. 登錄多實例mysql數據庫(以下是mysql命令加入環境變量後的)

[root@db01 /]# mysql -uroor -p -S /data/3307/mysql.sock    
Enter password:           
 
[root@db01 /]# mysql -uroor -p -S /data/3308/mysql.sock    
Enter password:

說明:多實例的登錄方式和單獨的登錄方式不同,他需要使用-S參數指定mysql.sock文件


6. 因爲腳本里面設置的密碼是oldboy 所以如果我們不設置將無法停止MySQL


mysqladmin password oldboy -S /data/3307/mysql.sock
mysqladmin password oldboy -S /data/3308/mysql.sock
mysql -uroot -poldboy -S /data/3307/mysql.sock   
mysql -uroot -poldboy -S /data/3308/mysql.sock

說明:在上傳的啓動命令文件(/data/{3307,3308}/mysql)中是有設置密碼的,但是是不影響的啓動並進入數據庫的,只是stop不了,如果想要停止數據庫,就必須爲該數據庫設置密碼。又因爲配置文件裏面的定義的密碼是oldboy,所以如果修改別的密碼要注意修改配置文件裏面的面,不然還是stop不了(啓動不影響)。


2.3 手動增加一個多實例3309

1. 創建一個3309多實例的目錄

[root@db01 /]# mkdir -p /data/3309/data/


2. 複製一份實例到指定的目錄

[root@db01 /]# \cp /data/3306/{my.cnf,mysql} /data/3309
[root@db01 /]# ll /data/3309
total 12
drwxr-xr-x 2 rootroot 4096 Aug 25 01:04 data       
-rw-r--r-- 1 rootroot 1899 Aug 25 01:04 my.cnf     
-rwxr-xr-x 1 rootroot 1307 Aug 25 01:04 mysq


3. 修改cp過來的配置文件及啓動腳本

[root@db01 /]# \cp /data/3309/{mysql,mysql.bak}       
[root@db01 /]# \cp /data/3309/{my.cnf,my.cnf.bak}     
ll /data/3309/
----------------------以下使用sed命令批量替換,主要修改兩處地方,如下--------------------
[root@db01 /]# sed -i 's#3306#3309#g' /data/3309/{my.cnf,mysql}            
[root@db01 /]# sed -i 's#server-id = 1#server-id = 8#g' /data/3309/my.cnf


4. 設置3309數據庫實例所有者爲mysql

[root@db01 /]# chown -R mysql.mysql /data/3309/
[root@db01 /]# chmod 700 /data/3309/mysql
[root@db01 /]# ll /data/3309/


5. 對新增加的3309多實例進行初始化數據庫操作

[root@db01 scripts]# cd /application/mysql/scripts/
[root@db01 scripts]# ./mysql_install_db --basedir=/application/mysql/ --datadir=/data//data/ --user=mysql


6. 對新增加的實例(3309)啓動命令授執行權限

[root@db01 scripts]# chmod +x /data/3309/mysql


7. 啓動新增多實例3309數據庫並檢查

[root@db01 scripts]# /data/3309/mysql start   
MySQL is running...
[root@db01 scripts]# ss -lntup|grep 3309      
tcp    LISTEN    0      600      *:3309        *:*      users:(("mysqld",16224,1


8. 登錄3309數據庫

[root@db01 scripts]# mysql -S /data/3309/mysql.sock
mysql>


9. 將數據庫命令加入開機自啓動(/etc/rc.local

[root@db01 scripts]# echo "/data/3309/mysql start" >>/etc/rc.local
[root@db01 scripts]# tail -1 /etc/rc.local


10. 因爲腳本里面設置的密碼是oldboy 所以如果我們不設置將無法停止MySQL


mysqladmin password oldboy -S /data/3309/mysql.sock
mysql -uroot -poldboy -S /data/3309/mysql.sock

------------------現在不光能啓動了,也可以關閉數據庫了!!!-----------------

說明:在上傳的啓動命令文件(/data/{3307,3308}/mysql)中是有設置密碼的,但是是不影響的啓動並進入數據庫的,只是stop不了,如果想要停止數據庫,就必須爲該數據庫設置密碼。又因爲配置文件裏面的定義的密碼是oldboy,所以如果修改別的密碼要注意修改配置文件裏面的面,不然還是stop不了(啓動不影響)。

 

2.4 多實例的配置文件和啓動腳本命令

說明:添加多實例時,只需要複製my.cnf配置文件和mysql啓動命令即可,只需要更改下兩個文件裏面的內容,添加多實例更改裏面內容時,建議使用sed命令更改。

 

1. 多實例配置文件對比,也是我們添加多實例需要更改注意的地方

以下以多實例33073308多實例配置文件做對比

[root@db01 /]# cat /data/3307/my.cnf

[root@db01 /]# cat /data/3308/my.cnf

[client]

port            = 3307 

socket          = /data/3307/mysql.sock

 

[mysql]

no-auto-rehash

 

[mysqld]

user     = mysql   

port     = 3307    

socket   = /data/3307/mysql.sock

basedir = /application/mysql

datadir = /data/3307/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/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

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 = 3

 

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/3307/mysql_oldboy3307.err

pid-file=/data/3307/mysqld.pid

[client]

port            = 3308

socket          = /data/3308/mysql.sock

 

[mysql]

no-auto-rehash

 

[mysqld]

user     = mysql

port     = 3308

socket   = /data/3308/mysql.sock

basedir = /application/mysql

datadir = /data/3308/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/3308/error.log

#log-slow-queries = /data/3308/slow.log

pid-file = /data/3308/mysql.pid

log-bin = /data/3308/mysql-bin

relay-log = /data/3308/relay-bin

relay-log-info-file = /data/3308/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 = 8

 

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/3308/mysql_oldboy3308.err

pid-file=/data/3308/mysqld.pid

 

2. 多實例啓動腳本/data/330*/mysql對比

說明:該啓動腳本中不一樣的內容只有一項,就是port不同,其他的都一樣。

[root@db01 /]# cat /data/3307/mysql

[root@db01 /]# cat /data/3308/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"

esac

#!/bin/sh


#init

port=3308

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"

esac

 

3. MySQL報錯問題及解決

實例1:MySQL多實例啓動故障排錯說明

如果MySQL多實例有服務器沒有啓動,排查辦法如下:

  • 如果發現沒有顯示MySQL對應案例的端口,請稍後等待幾秒在檢查,MySQL服務的啓動比web服務等會慢一些。

  • 如果還不行,請查看MySQL服務對應實例的錯誤日誌,錯誤日誌路徑在my.cnf配置的最下面定義,例如:3306實例的錯誤日誌爲:

[root@db01 /]# grep log-error/data/3306/my.cnf|tail -1
log-error=/data/3306/mysql_oldboy3306.err
  • 細看多有執行命令返回的屏幕輸出,不要忽略關鍵的輸出內容。

  • 輔助查看系統日誌/var/log/messages

  • 如果是MySQL關聯了其他服務,要同時查看相關服務的日誌。

  • 仔細閱讀,重新查看操作的步驟是否正確,書寫的命令及字符是不是都對。

 

實例2:/tmp目錄權限問題

給出提示“ERROR:1004 Can’t creale file‘/tmp/#sq1300e_1_0.frm(errno:13)”

在執行初始化數據庫命令是可能就會遇到這樣的錯誤。


問題原因:/tmp目錄不能創建文件,所以解決辦法爲給/tmp目錄增加權限。如下:

[root@db01 /]# ll -d /tmp/   
 4 root root 4096 Aug 24 23:18 /tmp/
[root@db01 /]# chmod 1777 /tmp/            
[root@db01 /]# ll -d /tmp/    
 4 root root 4096 Aug 24 23:18 /tmp/


實例3:磁盤空間滿導致初始化失敗

關於MySQL初始化,報以下錯誤提示!

[root@bd01 scripts]#./mysql_install_db --basedir=/application/mysql/ --datadir=/data/3306/data/--user=mysql
Installing MySQL system tables...
160824 11:38:37 [Note] /application/mysql//bin/mysqld(mysqld 5.5.49) starting as process 36154 ...
ERROR: 3 Error writing file './mysql/db.frm' (Errcode: 28)        
160824 11:38:37 [ERROR] Aborting

問題原因:最後查出原因,原來是磁盤空間不足所導致MySQL無法寫入數據!從而無法初始化成功數據庫

[root@bd01 scripts]# df -h
Filesystem     Size    Used    Avail    Use%    Mounted on
/dev/sda3      3.7G    3.6G    0        100%      /
tmpfs          238M     0      238M     0%      /dev/shm
/dev/sda1      190M    36M     145M     20%     /boot


4. MySQL數據庫基礎安全

1. 啓動程序設置700,屬主和用戶組爲mysql。

2. 爲MySQL超級用戶root設置密碼。

3. 如果要求嚴格可以刪除root用戶,創建其它管理用戶,例如admin。

4. 登錄時儘量不要在命令行爆漏密碼,備份腳本中如果有密碼,給設置700,屬主和用戶組爲mysql或root。

5. 刪除默認存在的test庫。

6. 初始刪除無用的用戶,只保留

   +------------------+
   | root | 127.0.0.1 |
   | root | localhost |
   +------------------+

7. 不要一個用戶管所有的庫,儘量專庫專戶。

8. 授權用戶對應的主機不要用%,權限不要給all,最小化授權。從庫只給select。

9. 清理mysql操作日誌文件~/.mysql_history(600權限,可以不刪)。

10. 禁止開發獲取到web連接的密碼,禁止開發連接操作生產對外的庫。

11. MySQL服務器禁止使用外網IP。

12. 防SQL注入(web),php.init或web開發插件空間,waf控制。

mysql安全加固http://www.cnblogs.com/yuwensong/archive/2013/03/26/2981965.html


5. 配置及管理MySQL數據庫簡單命令

1. 配置MySQL單實例及多實例數據庫啓動命令

   服務的開機自啓動很關鍵,MySQL多實例的自啓動也不例外,把MySQL多實例的啓動命令加入/etc/rc.local,實現開機自啓動。

單實例

/application/mysql/bin/mysqld_safe --user=mysql &   #

多實例

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

將啓動命令加入開機自啓動

[root@db01 /]# echo "#mysql multi instances">>/etc/rc.local
[root@db01 /]# echo "/application/mysql/bin/mysqld_safe --user=mysql &">>/etc/rc.local
[root@db01 /]# echo "data/3307/mysql start" >>/etc/rc.local 
[root@db01 /]# echo "data/3306/mysql start" >>/etc/rc.local 
[root@db01 /]# tail -4 /etc/rc.local
#mysql multiinstances
/application/mysql/bin/mysqld_safe--user=mysql &
data/3307/mysqlstart
data/3306/mysqlstart


2. MySQL數據庫密碼設置與修改

單實例

mysqladmin -u root password 'oldboy123'       
mysqladmin -uroot -poldboy123password 123456

多實例

mysqladmin -S /data/3306/mysql.sock password oldboy123          
mysqladmin -S /data/3306/mysql.sock -poldboy123 password 123456


3. MySQL數據庫單實例及多實例登錄

單實例

mysql                        
mysql -uroot -poldboy123    
mysql -uroot -p

多實例

mysql -S /data/3306/mysql.sock                   
mysql -uroot -poldboy -S /data/3306/mysql.sock


4. 查看數據庫版本及當前登錄用戶是什麼

mysql -S /data/3306/mysql.sock -e "select version();"  
select version();                                      
mysql -V                                              
mysql --help|grep Distrib                             
status;


5. MySQL數據的增刪改查(刪除無用的用戶和數據庫)數據庫操作

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.00sec)
---------------以下4條刪除無用的用戶,只保留以上紅色字體的用戶即可!
mysql> drop user "root"@"::1";
mysql> drop user ""@db01;     
mysql> drop user "root"@db01;  
mysql> drop user ""@"localhost";
 
mysql> flush privileges;                    
Query OK, 0 rowsaffected (0.00 sec)
 
mysql> show databases;                      
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00sec)
mysql> drop database test;                   
Query OK, 0 rowsaffected (0.16 sec)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章