文章目录
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库的所有表。