文章目錄
0、參考資料
本文安裝mysql的版本以5.7爲例,8.0也適用。
安裝包下載地址:https://dev.mysql.com/downloads/mysql/5.7.html
官方文檔參考:https://dev.mysql.com/doc/refman/5.7/en/installing.html
1、Mysql的安裝
mysql推薦的安裝方式:
安裝方式 | 特點 | 是否推薦 |
---|---|---|
二進制 | 簡單靈活,方便提bug | 推薦 |
源碼 | 自己動手編譯並調優,可能出錯較多 | 不推薦,學習環境推薦源碼 |
RPM包 | 安裝位置按照約定的目錄,不靈活 | 不推薦 |
二進制包:Linux-Generic
1.0、系統環境準備
以centos7爲例:關閉防火牆和selinux
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
1.1、軟件解壓和安裝
root執行,mysql basedir爲習慣默認的/usr/local/mysql
tar zxvf mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz -C /opt/
mv /opt/mysql-5.7.29-linux-glibc2.12-x86_64 /opt/mysql
ln -s /opt/mysql /usr/local/mysql
使用軟鏈是爲了以後的升級替換
1.2、新建用戶、目錄
爲了安全起見,mysql用戶建議設置爲,不可登錄,禁用shell.
groupadd mysql
useradd -g mysql -d /home/mysql -s /sbin/nologin -M -n mysql
-s 是禁用shell
mkdir /data/mysql/項目名-端口號
mkdir -p /data/mysql/mysql3306/{data,logs,tmp}
chown -R mysql:mysql /data/mysql/mysql3306/
chown -R mysql:mysql /usr/local/mysql/
1.3、安裝
目錄約定:
/etc/my.cnf --默認配置文件位置
/usr/local/mysql --軟鏈接後的basedir,軟件安裝目錄
/data/mysql/mysql3306 --存放mysql實例的目錄,mysql+端口號爲項目名
/data/mysql/mysql3306/data --存放數據庫的目錄
/data/mysql/mysql3306/logs --存放日誌文件
/data/mysql/mysql3306/tmp --tmpdir目錄
1.3.1、mysql5.7 以上版本初始化:
my.cnf配置文件:
[client]
default-character-set=utf8mb4
port= 3306
socket= /tmp/mysql.sock
[mysqld]
server-id = 2020021325
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /data/mysql/mysql3306/data
socket = /data/mysql/mysql3306/mysql.sock
pid-file = /data/mysql/mysql3306/mysql.pid
event_scheduler = 0
lower_case_table_names = 1
character-set-server = utf8mb4
transaction-isolation = REPEATABLE-READ
skip_name_resolve
max_connect_errors = 100000
max_connections = 2048
skip-external-locking
max_allowed_packet = 1G
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
wait_timeout = 3600
interactive_timeout = 3600
explicit_defaults_for_timestamp = 1
secure_file_priv = /tmp
slow_query_log=1
slow_query_log_file =/data/mysql/mysql3306/logs/mysql-slow.log
long_query_time = 0.3
log-error=/data/mysql/mysql3306/logs/mysql-error-log.err
log_error_verbosity = 3
log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
log_slow_slave_statements = 1
log_throttle_queries_not_using_indexes = 10
expire_logs_days = 7
min_examined_row_limit = 100
log_timestamps=system
plugin_dir=/usr/local/mysql/lib/plugin
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
[mysqld_safe]
log-error=/data/mysql/mysql3306/logs/mysql-error-log.err
pid-file=/data/mysql/mysql3306/mysql.pid
初始化命令說明:
/usr/local/mysql/bin/mysqld --defaults-file=配置文件路徑 --initialize
-- 這裏的bin目錄是mysql tar包的解壓目錄。
-- 初始化日誌:/usr/local/mysql/logs/mysql-error-log.err
帶密碼的初始化:
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3306/my.cnf --initialize
注意:--defaults-file選項必須放在第一位。
從告警日誌中找到初始密碼:
[root@onetest lib]# grep password /data/mysql/mysql3306/logs/mysql-error-log.err
2020-02-13T18:59:21.810637+08:00 1 [Note] A temporary password is generated for root@localhost: +Ay%,p;T5?Dp
不要密碼的初始化:
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3306/my.cnf --initiaize-insecure
1.3.2、mysql5.6初始化:
/usr/local/mysql/scripts/mysql_install_db
5.7以下初始化不會帶默認密碼
1.4、啓動mysql並修改初始化密碼
推薦,mysqld直接啓動方式
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3306/my.cnf 2>&1 &
該方式啓動後只有mysqld進程,沒有mysqld_safe進程。mysqld_safe進程的作用是當mysqld進程掛掉後,會把mysqld進程拉起來,作爲專業的dba不需要此多餘動作,mysqld進程掛掉後手工排查錯誤原因,修復後手動起來。
[mysql@onetest ~]$ ps -ef|grep mysql
root 47962 40952 0 18:55 pts/1 00:00:00 tail -f mysql-error-log.err
mysql 48602 39203 0 19:02 pts/0 00:00:01 /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3306/my.cnf
mysqld_safe方式
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/mysql3306/my.cnf 2>&1 &
該方式啓動後,會發現有mysqld進程和mysqld_safe進程。
[mysql@onetest ~]$ ps -ef|grep mysql
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/mysql3306/my.cnf
mysql 51520 51010 0 19:26 pts/0 00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3306/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/mysql3306/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/mysql3306/logs/mysql-error-log.err --pid-file=/data/mysql/mysql3306/mysql.pid --socket=/data/mysql/mysql3306/mysql.sock --port=3306
小測試:把mysqld進程kill掉後,mysqld進程被自動拉起來
2020-02-13T11:26:33.247447Z mysqld_safe Logging to '/data/mysql/mysql3306/logs/mysql-error-log.err'.
2020-02-13T11:26:33.287027Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/mysql3306/data
/usr/local/mysql/bin/mysqld_safe: line 198: 51520 Killed nohup /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3306/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/mysql3306/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/mysql3306/logs/mysql-error-log.err --pid-file=/data/mysql/mysql3306/mysql.pid --socket=/data/mysql/mysql3306/mysql.sock --port=3306 < /dev/null > /dev/null 2>&1
2020-02-13T11:29:13.814336Z mysqld_safe Number of processes running now: 0
2020-02-13T11:29:13.821049Z mysqld_safe mysqld restarted
啓動腳本方式
/etc/init.d/mysqld3306 start
mysqld3306啓動腳本來自:
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld3306
啓動腳本有個不好的地方就是你可能需要修改腳本中my.cnf、pid、basedir等變量的位置。需要根據實際情況修改爲適合自己的啓動/停止腳本。
啓動多實例的方式
/usr/local/mysql/bin/mysqld_safe --defaults-file=
/usr/local/mysql/bin/mysqld --defaults-file=
/usr/local/mysql/bin/mysqld_multi start 3307
mysqld_multi是不推薦的方式,官方已經不再更新這個腳本。
登錄mysql修改初始密碼
/usr/local/mysql/bin/mysql -S /data/mysql/mysql3306/mysql.sock -p
輸入剛纔從日誌中找到的密碼。
mysql> alter user user() identified by '1234.C0m';
Query OK, 0 rows affected (0.01 sec)
1.5、關閉mysql實例
shutdown方式
進入mysql後,有shutdown權限
mysql> shutdown;
Query OK, 0 rows affected (0.00 sec)
mysqladmin方式
/usr/local/mysql/bin/mysqladmin -S /data/mysql/mysql3306/mysql.sock shutdown -p
腳本方式
/etc/init.d/mysqld3306 stop
1.6、mysql多實例安裝
有時候爲了節省主機資源或者做測試用,需要在同一個主機上安裝多個版本的mysql實例或者在同一個軟件下啓動多個實例。
下面以安裝mysql3307這個實例爲例:軟件包安裝略
1、準備目錄和my.cn配置文件
mkdir -p /data/mysql/mysql3307/{data,logs,tmp}
cp /data/mysql/mysql3306/my.cnf /data/mysql/mysql3307/my3307.cnf
chown -R mysql:mysql /data/mysql/mysql3307/
sed -i 's/3306/3307/g' /data/mysql/mysql3307/my3307.cnf
2、初始化mysql3307:
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3307/my3307.cnf --initialize
3、啓動3307實例
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3307/my3307.cnf &
4、登錄3307並修改初始密碼
/usr/local/mysql/bin/mysql -S /data/mysql/mysql3307/mysql.sock -p
輸入剛纔從日誌中找到的密碼:qch6Z6y%v/cq
mysql> alter user user() identified by '1234.C0m';
Query OK, 0 rows affected (0.01 sec)
2、MySQL啓動故障分析
2.1、查找配置文件優先級
MySQL 讀取配置文件的優先級,從高到低:
mysqld --verbose --help| grep my.cnf
1. --defaults-file 指定文件路徑
2. /etc/my.cnf
3. /etc/mysql/my.cnf
4. /usr/local/mysql/etc/my.cnf
5. ~/.my.cnf
2.2、排除啓動故障思路
找到mysqld啓動時加載的my.cnf配置文件,才能根據報錯信息繼續分析具體錯誤原因。
遇到的問題:
1)[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
解決:修改配置文件添加如下參數
[mysqld]
explicit_defaults_for_timestamp=true
3、MySQL日誌
每個數據庫有自己獨立的文件目錄
frm 是表結構
ibd 是存放表數據的表空間,數據和索引在一起
general_log
全局:
show global variables like '%log%';
session:
show variables like '%log%';
general_log 可以做日誌分析,在數據庫的每個操作都會記錄
log_error
記錄錯誤日誌,有可能會出現session和數據庫斷開連接的報錯,可以設置log_error_verbosity=1 ,來屏蔽相關報錯。
slow_query_log_file
記錄超過時限的sql,有參數long_query_time控制,默認是10s,推薦修改爲1s,或0.5s
高併發時Innodb狀態
show engine innodb status\G
innodb_status_file =1
生產上建議關閉這個功能
二進制日誌
log_bin,mysql啓動時,會從log_bin指定的目錄裏面去for循環遍歷所有bin log 文件,然後找文件名最大的那個文件,再最大的文件名上+1,然後去啓動mysql。例如,現在的bin log是mysql-bin.000017,下次啓動時,會從1 一直讀到17,然後從18開始啓動。
建議備份,保留7天,expire_logs_days控制
mysql 啓動時用了哪些default
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3307/my3307.cnf --print-defaults
mysql-log-rotate
mysql-log-rotate 可以用來管理error.log的切換
4、MySQL管理之牛刀小試
MySQL是否正常工作
- 進程是否存在: ps aux| grep mysqld
- 監聽的端口是否正常 :mysql -S /tmp/mysql3307.sock -uroot -p123456
- 是否有連接:show processlist;
- 端口是否被監聽:netstat -nlap | grep “sock”
- telnet ip port
- 遠程連接 mysql -h 目標ip -P 3306 -uroot -p
爲開發人員創建個業務用戶
開發一般需要的權限 CRUD:select, insert, delete, update. drop table 慎給,可以給truncate 權限。
create table 和alter table 不能給開發,因爲通過這2個權限可以繞過審計。
create database myprd;
create user 'prd_app'@'192.168.%' identified by '1234.C0m';
--創建一個只能從192.168網段登錄的prd_app用戶
grant select ,update, delete ,insert on myprd.* to 'prd_app'@'192.168.%' ;
--prd_app 用戶能訪問myprd庫的所有表。