MySQL啟動與多實例安裝
阿新 • • 發佈:2018-02-27
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啟動
- mysqld_safe是mysqld的守護進程
- 一機多實例啟動也就簡單了
- mysqld_safe啟動,mysqld進程掛掉,會自動重啟,不便於定位問題
三、一機多實例
3.1 場景
防止兩個業務之間影響,每個業務需要的資源不大,2、3G內存就夠了
MySQL隨著連接數的上升性能會下降,通過拆分實例降低連接數
不同端口號跑不同的業務
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
- mysqld_multi是用一個配置文件實現一機多實例
- mysqld_multi可以調用mysqld_safe,也可以調用mysqld
- 如果mysqld_multi,建議調用mysqld_safe
- my.cnf必須在/etc/my.cnf這個位置
- 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非常大怎麽辦?
很有可能是啟用了共享表空間,改成獨立表空間
共享表空間,就是把數據清理掉後,也不會回收空間
解決:
- dump出來
- 啟用獨立表空間導入
6.4 優化錯誤
[mysqld_safe]
malloc-lib = /usr/local/mysql/lib/mysql/libjemalloc.so
用/etc/init.d/mysql和mysqld_safe啟,連錯誤日誌都沒有寫
錯誤日誌是由mysqld來寫的,所以連mysqld都沒有調用到
解決:
- 把缺少的文件找來編譯放進去
- 把這句優化註釋掉
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 要求
- 能按著要求布署一個數據庫3378
- 了解幾種啟動方式的調用關系
- 了解配置文件加載的順序
- 掌握啟動故障的排查思路
- 多實例的布署
MySQL啟動與多實例安裝