1. 程式人生 > >MySQL啟動與多實例安裝

MySQL啟動與多實例安裝

chkconfig 內存 stat 過大 推薦 class find 其他 port

啟動方式及故障排查

一、幾個問題

1.1 /etc/init.d/mysql 從哪來

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql

1.2 mysql能否設置成開機啟動

可以,但是沒必要

# 方法1:
chkconfig mysql on
# 方法2:
echo "/etc/init.d/mysql start" >> /etc/rc.local

1.3 開機啟動?

有沒有必要把MySQL設置為開機啟動

如果線上庫,建議關閉自動啟動,線上庫本著一個原則,出錯了就停下來,用腳本批量啟動

1.4 配置文件位置及加載順序

mysqld可以加載哪些位置的配置文件

mysql global status | grep my.cnf
mysql --help | grep my.cnf
mysqld --verbose --help | grep my.cnf

man mysqld
mysqld --verbose --help | grep defaults-file
--defaults-file=#       Only read default options from the given file #.

# my.cnf加載順序:
# /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 

1.5 mysql的啟動方式

# 1
/etc/init.d/mysql start
# 2(1與2都是調用的mysql.server)
service mysql start
# 3
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
# 4
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf &

# mysql.server調用的mysqld_safe
# mysqld_safe調用的mysqld (mysqld_safe是mysqld的守護進程,會自動重啟)

# 建議用如下啟動方式,一機多實例啟動也就簡單了
# mysqld_safe啟動,mysqld進程掛掉,會自動重啟,不便於定位問題
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf &
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3376/my3376.cnf &
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3377/my3377.cnf &

# 關閉
/usr/local/mysql/bin/mysqladimn -S /tmp/mysql3376.sock shutdown

二、為什麽推薦用mysqld啟動

  1. mysqld_safe是mysqld的守護進程
  2. 一機多實例啟動也就簡單了
  3. mysqld_safe啟動,mysqld進程掛掉,會自動重啟,不便於定位問題

三、一機多實例

3.1 場景

  1. 防止兩個業務之間影響,每個業務需要的資源不大,2、3G內存就夠了

  2. MySQL隨著連接數的上升性能會下降,通過拆分實例降低連接數

  3. 不同端口號跑不同的業務

3376->userdb

3377->cmsdb

3.2 技巧,減少誤操作

一組MySQL用一個唯一端口號,所有的組之間不要重復

如:一組對應的一主兩從

3.3 實現

1. 創建目錄
mkdir -p /data/mysql/mysql3377/{data,tmp,logs}

2. 修改配置文件,端口
# cp /data/mysql/mysql3376/mysql3376.cnf /data/mysql/mysql3377/mysql3377.cnf
# cp /etc/my.cnf /data/mysql/mysql3377/mysql3377.cnf
# sed -i 's/3376/3377/g' /data/mysql/mysql3377/mysql3377.cnf
cp /etc/my.cnf /etc/mysql3377.cnf
sed -i 's/3376/3377/g' /etc/mysql3377.cnf

3. 修改權限
sudo chown -R mysql:mysql /data/mysql/mysql3377

4. 初始化,指定配置文件
cd /usr/local/mysql
# ./scripts/mysql_install_db --defaults-file=/data/mysql/mysql3377/mysql3377.cnf
sudo ./scripts/mysql_install_db --defaults-file=/etc/mysql3377.cnf

5. 通過mysqld啟動
# mysqld --defaults-file=/data/mysql/mysql3377/mysql3377.cnf &
mysqld --defaults-file=/etc/mysql3377.cnf &

6. 安全加固
mysql -S /tmp/mysql3377.sock

7. 關閉
mysqladimn -S /tmp/mysql3377.sock shutdown

# 可以寫成腳本,只需要如下3個參數
port, bp size, appname
$appname$port

四、mysqld_multi

  1. mysqld_multi是用一個配置文件實現一機多實例
  2. mysqld_multi可以調用mysqld_safe,也可以調用mysqld
  3. 如果mysqld_multi,建議調用mysqld_safe
  4. my.cnf必須在/etc/my.cnf這個位置
  5. http://www.cnblogs.com/LCX/archive/2010/04/02/1703215.html

4.1 向my.cnf追加如下內容

必須是/etc/my.cnf這默認位置的配置文件

[mysqld_safe]的參數僅供mysqld_safe程序使用

[mysqldN]會覆蓋[mysqld]的部分,前綴必須是mysqld

port/datadir/socket必須不能一樣

[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
# 用來做關閉mysql使用
user = root
# password = 123456
log = /data/mysql/mysqld_multi.log

[mysqld3378]
socket = /tmp/mysql3378.sock
port = 3378
datadir = /data/mysql/mysql3378/data
user = mysql
pid-file = /data/mysql/mysql3378/data/mysql3378.pid
log-error = /data/mysql/mysql3378/logs/error.log
log-bin = /data/mysql/mysql3378/logs/mysql-bin
innodb_data_home_dir = /data/mysql/mysql3378/data
innodb_log_group_home_dir = /data/mysql/mysql3378/logs
 
[mysqld3379]
socket = /tmp/mysql3379.sock
port = 3379
datadir = /data/mysql/mysql3379/data
user = mysql
pid-file = /data/mysql/mysql3379/data/mysql3379.pid
log-error = /data/mysql/mysql3379/logs/error.log
log-bin = /data/mysql/mysql3379/logs/mysql-bin
innodb_data_home_dir = /data/mysql/mysql3379/data
innodb_log_group_home_dir = /data/mysql/mysql3379/logs

4.2 啟動

# 查看MySQL狀態
/usr/local/mysql/bin/mysqld_multi report

# 前提是3378和3379的數據庫文件已經初始化完了
cd /usr/local/mysql
./scripts/mysql_install_db --defaults-file=/etc/mysql3378.cnf
./scripts/mysql_install_db --defaults-file=/etc/mysql3379.cnf

# 啟動,不加參數是啟動所有實例
/usr/local/mysql/bin/mysqld_multi start
# 只啟動3376,通過端口號指定
/usr/local/mysql/bin/mysqld_multi start 3376

# 關閉,不加參數是關閉所有實例
mysqld_multi stop
mysqld_multi stop 3376
mysqladmin shutdown -S /tmp/mysql3376.sock

4.3 單機跑多實例

# 以下三個絕對不能一樣
port
datadir
socket

server-id

五、打包初始化

/data/mysql/mysql3376
# 打包前,刪除auto.cnf
rm -rf /data/mysql/mysql3376/auto.cnf
tar -czvf mysqldata.tar.gz /data/mysql/mysql3376

六、故障排查

6.1 看錯誤日誌

# my.cnf定義錯誤日誌的輸出
log-error = /data/mysql/mysql3376/logs/error.log

cat /data/mysql/mysql3376/logs/error.log

6.2 字典數據過大

# 數據字典文件
innodb_data_file_path=ibdata1:100M:autoextend

# 不能改大,改小了可以

技術分享圖片

6.3 ibdata1非常大

ibdata1非常大怎麽辦?

很有可能是啟用了共享表空間,改成獨立表空間

共享表空間,就是把數據清理掉後,也不會回收空間

解決:

  1. dump出來
  2. 啟用獨立表空間導入

6.4 優化錯誤

[mysqld_safe]
malloc-lib = /usr/local/mysql/lib/mysql/libjemalloc.so

用/etc/init.d/mysql和mysqld_safe啟,連錯誤日誌都沒有寫

錯誤日誌是由mysqld來寫的,所以連mysqld都沒有調用到

解決:

  1. 把缺少的文件找來編譯放進去
  2. 把這句優化註釋掉

6.5 啟動mysql的用戶

2017-11-18 12:52:04 4766 [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!

以mysql身份來啟動mysql ------不是這個原因

# su - root -c "command"
mysqld --defaults-file=/data/mysql/mysql3377/mysql3377.cnf &
su - mysql -c "mysqld --defaults-file=/data/mysql/mysql3377/mysql3377.cnf &"

my.cnf不要讓其他用戶有w權限

6.6 設置error_log

error_log必須提前創建好

https://bugs.mysql.com/bug.php?id=84427

6.7 權限錯誤

/tmp目錄權限不對

技術分享圖片

/tmp是個特殊目錄,在日常操作中,該目錄會被誤操作

iptables

firewalld

selinux

getenforce

七、總結

7.1 問題來源:

目錄權限問題
優化問題

7.2 解決思路:

看調用關系
看日誌

7.3 要求

  1. 能按著要求布署一個數據庫3378
  2. 了解幾種啟動方式的調用關系
  3. 了解配置文件加載的順序
  4. 掌握啟動故障的排查思路
  5. 多實例的布署

MySQL啟動與多實例安裝