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