MySQL初始化安裝部署

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庫的所有表。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章