【mysql使用系列】mysql5.7安装和物理文件解读

安装规划

不要安装在根目录下,尽量挂在数据盘下。通用做法:数据盘/data。

mysql下载、安装和配置

下载、解压、环境变量配置

groupadd mysql
useradd -g mysql -s /sbin/nologin mysql
cd /root/
tar -zxvf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz -C /data
cd /data/
ln -s mysql-5.7.17-linux-glibc2.5-x86_64 mysql
echo "export PATH=$PATH:/data/mysql/bin" >> /etc/profile
source /etc/profile

创建数据、日志、配置文件目录

mkdir -p /data/mysql/{data,binlogs,log,etc,run}
chown -R mysql.mysql /data/mysql/{data,binlogs,log,etc,run}

增加配置文件

编译版本的mysql,配置文件只允许在/etc/my.cnf(或者/etc/mysql/my.cnf、/usr/local/mysql/etc/my.cnf).vim etc/my.cnf

[client]
port = 3306
socket = /data/mysql/run/mysql.sock
[mysqld]
port = 3306
basedir=/data/mysql/
socket = /data/mysql/run/mysql.sock
pid_file = /data/mysql/run/mysql.pid
datadir = /data/mysql/data
default_storage_engine = InnoDB
max_allowed_packet = 512M
max_connections = 2048
open_files_limit = 65535
skip-name-resolve
lower_case_table_names=1
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
innodb_buffer_pool_size = 1024M
innodb_log_file_size = 2048M
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 0
key_buffer_size = 64M
log-error = /data/mysql/log/mysql_error.log
log-bin = /data/mysql/binlogs/mysql-bin
slow_query_log = 1
slow_query_log_file = /data/mysql/log/mysql_slow_query.log
long_query_time = 5

tmp_table_size = 32M
max_heap_table_size = 32M
query_cache_type = 0
query_cache_size = 0
server-id=1

mysql初始化和物理文件解读

参考 https://dev.mysql.com/doc/refman/5.7/en/programs-overview.html ,说明下mysql组件中最常用的三个组件:

  • mysqld
    mysql daemon,mysql server。
  • mysql
    The command-line tool for interactively entering SQL statements or executing them from a file in batch mode)
  • mysql_ssl_rsa_setup
    This program creates the SSL certificate and key files and RSA key-pair files required to support secure connections, if those files are missing.

mysql服务端启动核心-mysqld帮助

初始化mysql数据库

mysqld --initialize-insecure --user=mysql --basedir=/data/mysql --datadir=/data/mysql/data
mysql_ssl_rsa_setup --basedir=/data/mysql --datadir=/data/mysql/data/

查看数据库物理文件

cd /data/mysql/data/

mysql系统数据库

在MySQL5.7.17中,系统数据库包括information_schema,mysql,sys,performance_schema

  • information_schema库
    提供了数据库的元数据信息,是数据库的数据,比如数据库的名字,数据库中的表名,字段名,字段类型等,可以说是数据库的数据字典信息。
    这个库中的信息并非物理地保存在表中,而是动态地去读取其他文件得到的,比如上面一开始提到的共享表空间,对于用户数据中的对象,比如表结构等,都保存在共享表空间中,
    information_schema库中的一些信息可以认为是直接映射到共享表空间中的信息的。因此第一个截图中,并没有information_schema的路径(文件夹)

  • performance_schema库
    是数据库性能相关的信息的数据,记录的是数据库服务器的性能参数。
    1)保留进程等待信息,包括锁,互斥变量,文件信息等。
    2)保存历史事件汇总信息,为MySQL服务器性能评估提供参考信息
    3)配置型选项,来决定是否记录一些与性能相关的信息,比如profile信息等,参考http://www.cnblogs.com/wy123/p/6979499.html

  • sys库
    可以根据sys库中的数据快速了解系统的运行信息,方便地查询出来数据库的信息,在性能瓶颈,自动化吧运维等方面都有很大的帮助
    sys库中的信息是通过视图的方式,将information_schema和performance_schema库中的数据结合起来,可以得到更加直观和容易理解的信息

  • mysql库
    存储了系统的用户权限信息及帮助信息,新建的用户,用户的权限信息的都存储在MySQL库。比如在修改MySQL的root密码的时候,都要先use mysql这个系统库,然后再执行用户,授权等操作。
    对于innodb表,如果是独立的表空间的话,数据库中的表结构以及数据都存储在数据库的路径下(而不是在共享表空间中ibdata1文件中)
    但是数据中的其他对象,包括undo信息,也即数据被修改之后,事务提交之间的版本信息,仍然存储在共享表空间的ibdata1文件中

基于ibdata1文件的共享表空间

对于innodb,innodb_file_per_table选项决定了是否启动独立表空间,MySQL5.7中是默认启动的,也就是说MySQL的用户数据库将使用独立表空间来存储数据。

基于ibtmp1文件的临时表空间

临时表空间是存储全局级,回话级,事物级,检索级临时表对象的地方,有参数innodb_temp_data_file_path可以看到临时表空间的信息。

基于ib_logfileN的重做日志

redo日志默认情况下有两个文件,也即:ib_logfile0和ib_logfile1。
如果在数据库启动的过程中没有这两个文件,系统会默认自动生成这两个文件。默认情况下,ib_logfile0和ib_logfile1是两个独立的日志文件(可以配置的更多个ib_logfile文件),但是redo日志的写入在逻辑上对于ib_logfile0和ib_logfile1是连续的。重做日志是MySQL事物处理的核心文件,事务处理的核心之一是一致性,也就是说要么全做,要么全不做。

基于mysql-bin.X的binlog文件

bin-log日志记录数据中发生的写入性操作(增删改),但不记录查询操作,语句以事件的方式保存,描述了数据的更改过程,此日志对发生灾难时数据恢复、主从同步中起到了极为重要的作用。

mysql配置systemd启动

mysql配置systemd启动

cd /usr/lib/systemd/system
touch mysqld.service
vim mysqld.service

最终的文件如下:

# systemd service file for MySQL forking server

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/data/mysql/run/mysqld.pid
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
# Execute pre and post scripts as root
PermissionsStartOnly=true
# Needed to create system tables
#ExecStartPre=/home/bin/mysqld_pre_systemd
# Start main service
ExecStart=/data/mysql/bin/mysqld --daemonize --pid-file=/data/mysql/run/mysqld.pid $MYSQLD_OPTS
# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysq
# Sets open_files_limit
LimitNOFILE = 65535
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false

mysql启动

systemctl daemon-reload
systemctl enable mysqld.service
systemctl is-enabled mysqld
systemctl start mysqld.service

mysql修改root密码和访问权限

mysql -h localhost -u root
flush privileges;
use mysql;
UPDATE user SET authentication_string = PASSWORD('123456'), password_expired = 'N' WHERE User = 'root' AND Host = 'localhost';
UPDATE user SET Host = '%' WHERE User = 'root';
flush privileges;