第1章 MySQL初始化安装、简单安全加固 - xiaoboluo768/qianjinliangfang GitHub Wiki
1.2.1
[root@localhost ~]# cd /root
[root@localhost ~]# wget https://cdn.mysql.com//Downloads/MySQL-5.6/mysql- 5.6.35-linux-glibc2.5-\
x86_64.tar.gz
[root@localhost ~]# ll mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
-rw-r--r-- 1 root root 314581668 2月 12 23:04 mysql-5.6.35-linux- glibc2.5-x86_64.tar.gz
1.2.2
[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd mysql -r -g mysql
# 验证用户组和用户
[root@localhost ~]# id mysql
uid=500(mysql) gid=500(mysql) 组=500(mysql)
1.2.3
[root@localhost ~]# mkdir /home/mysql/{program,data,conf} -p
[root@localhost ~]# mkdir /home/mysql/data/mysqldata1/{mydata,sock,tmpdir,log,innodb_ts,\
innodb_log,undo,slowlog,binlog,relaylog} -p
# 查看创建目录结果
[root@localhost ~]# tree /home/mysql/ #如果没有这个命令,就使用yum install tree -y 安装
......
13 directories, 0 files
1.2.4
[root@localhost ~]# cd /root
[root@localhost ~]# tar xf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz -C/home/mysql/\
program/
[root@localhost ~]# chown mysql.mysql /home/mysql -R
# 查看datadir关键目录的权限是否正确
[root@localhost ~]# ll /home/mysql/data/mysqldata1/
......
1.2.5
[root@localhost ~]# ln –s\
/home/mysql/program/mysql-5.6.35-linux-glibc2.5-x86_64 /usr/ local/mysql
# 查看basedir关键程序目录是否可用
[root@localhost ~]# ll /usr/local/mysql/
......
[root@localhost ~]# export PATH=$PATH:/usr/local/mysql/bin/
[root@localhost ~]# echo 'export PATH=$PATH:/usr/local/mysql/bin/' >> /etc/profile
# 查看环境变量配置是否成功添加到/etc/profile文件中
[root@localhost ~]# tail -1 /etc/profile
export PATH=$PATH:/usr/local/mysql/bin/
1.2.6
[root@localhost ~]# cp -ar /usr/local/mysql/support-files/my-default.cnf /home/mysql/\
conf/my.cnf
[root@localhost ~]# ln -s /home/mysql/conf/my.cnf /etc/my.cnf
# my.cnf配置文件内容如下
[root@localhost ~]# cat /home/mysql/conf/my.cnf
[client]
socket=/home/mysql/data/mysqldata1/sock/mysql.sock # sock文件所在路径
[mysqld]
user=mysql
basedir = /usr/local/mysql
socket=/home/mysql/data/mysqldata1/sock/mysql.sock # sock文件所在路径
pid-file=/home/mysql/data/mysqldata1/sock/mysql.pid # pid文件所在路径
datadir=/home/mysql/data/mysqldata1/mydata # 数据文件路径
tmpdir=/home/mysql/data/mysqldata1/tmpdir # 存放临时文件的路径
log-error=/home/mysql/data/mysqldata1/log/error.log
slow_query_log
slow_query_log_file=/home/mysql/data/mysqldata1/slowlog/slow-query.log
log-bin=/home/mysql/data/mysqldata1/binlog/mysql-bin
relay-log=/home/mysql/data/mysqldata1/relaylog/mysql-relay-bin
innodb_data_home_dir = /home/mysql/data/mysqldata1/innodb_ts
innodb_log_group_home_dir = /home/mysql/data/mysqldata1/innodb_log
innodb_undo_directory = /home/mysql/data/mysqldata1/undo/
1.2.7
[root@localhost ~]# cd /usr/local/mysql/
[root@localhost mysql]# ./scripts/mysql_install_db --defaults-file=/home/ mysql/conf/my.\
cnf--user=mysql
......
# 查看关键目录在初始化之后是否有正确的数据文件和目录、权限
[root@localhost mysql]# ll /home/mysql/data/mysqldata1/{mydata,innodb_log, innodb_ts}/
......
:
[root@localhost mysql]# mysqld --defaults-file=/etc/my.cnf --initialize
[root@localhost mysql]# mysqld --defaults-file=/etc/my.cnf --initialize-insecure
1.2.8
[root@localhost mysql]# cp -ar /usr/local/mysql/support-files/mysql.server /etc/init.d/\
mysqld
[root@localhost mysql]# chmod +x /etc/init.d/mysqld
# 查看/etc/init.d/mysqld是否被成功赋予执行权限
[root@localhost mysql]# ll /etc/init.d/mysqld
-rwxr-xr-x 1 mysql mysql 10875 11月 28 23:32 /etc/init.d/mysqld
[root@localhost mysql]# service mysqld start
Starting MySQL.. [确定]
# 查看进程和端口
[root@localhost mysql]# ps aux |grep mysqld
......
[root@localhost mysql]# netstat -ntupl |grep mysqld
tcp 0 0 :::3306 :::* LISTEN 10743/mysqld
# 查看错误日志
[root@localhost mysql]# vim /home/mysql/data/mysqldata1/log/error.log
# 注意:日志中不能出现ERROR错误,看到最后一行输出版本号和socket信息就表示MySQL启动成功
Version: '5.6.35-log' socket: '/home/mysql/data/mysqldata1/sock/mysql. sock' port: 3306 MySQL Community Server (GPL)
1.3.1
[root@localhost mysql]# mysql
......
# 查看当前登录用户
mysql> select user();
......
1 row in set (0.00 sec)
# 查看当前MySQL版本是否正确
mysql> select version();
......
1 row in set (0.00 sec)
1.3.2
mysql> select user,host from mysql.user;
......
6 rows in set (0.00 sec)
mysql> delete from mysql.user where user!='root' or host!='localhost';
Query OK, 5 rows affected (0.01 sec)
## 如果是MySQL 5.7.x 较新的版本或者8.0.x版本,则删除操作需要排除几个系统用户
mysql> DELETE FROM mysql.user WHERE user NOT IN ('mysql.sys', 'mysql.session','mysqlxsys', 'root','mysql.infoschema') OR host NOT IN ('localhost');
# 查看删除结果是否正确
mysql> select user,host from mysql.user;
......
1 row in set (0.00 sec)
mysql> set password for 'root'@'localhost' = PASSWORD('admin'); # 在MySQL 5.7.x版本中可以不需要PASSWORD函数,直接使用明文密码也可以自动转换为加密格式密码写入mysql.user表中,且该用法将在后续版本中移除
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql>
# 重新使用新密码登录MySQL
[root@localhost mysql]# mysql -uroot -p
......
1.3.3
mysql> show databases;
......
4 rows in set (0.00 sec)
mysql> drop database test;
Query OK, 0 rows affected (0.00 sec)
# 查看删除结果是否正确
mysql> show databases;
......
3 rows in set (0.00 sec)
mysql> select * from mysql.db\G # MySQL 5.7.x版本移除了test库之后,该库的权限也没有了,但增加了sys库,有对应的sys库的默认权限,所以5.7.x版本忽略清理该表
......
mysql> truncate mysql.db;
Query OK, 0 rows affected (0.00 sec)
## 如果是MySQL 5.7.x 较新的版本或者8.0.x版本,则清理操作需要排除几个系统用户
mysql> DELETE FROM mysql.db where user NOT IN ('mysql.sys', 'mysql.session','mysqlxsys', 'root','mysql.infoschema') OR host NOT IN ('localhost') ;
# 查看清理结果是否正确
mysql> select * from mysql.db\G
Empty set (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql>
1.4.1
# 创建管理用户
mysql> create user 'gangshen'@'%' identified by 'admin';
Query OK, 0 rows affected (0.01 sec)
mysql> create user 'gangshen'@'localhost' identified by 'admin';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on *.* to 'gangshen'@'%' with grant option;
Query OK, 0 rows affected (0.00 sec)
# 注:在MySQL 5.7.x较新的版本及其8.0.x版本中,在授予%号地址来源时也同时包含了localhost,不再单独区分
mysql> grant all on *.* to 'gangshen'@'localhost' with grant option;
Query OK, 0 rows affected (0.00 sec)
# 使用新创建的管理账号重新登录MySQL,验证这个管理账号是否可用
[root@localhost mysql]# mysql -ugangshen -p
......
mysql> show grants;
......
1 row in set (0.00 sec)
1.4.2
# 使用管理员账号创建库、表
mysql> create database shengang_db;
Query OK, 1 row affected (0.00 sec)
mysql> use shengang_db
Database changed
mysql> create table shengang_table(id int primary key auto_increment, shengang_test varchar(50),datetime_current datetime);
Query OK, 0 rows affected (0.02 sec)
# 创建程序账号并赋予权限
mysql> create user 'program'@'192.168.2.105' identified by 'admin';
Query OK, 0 rows affected (0.00 sec)
mysql> create user 'program'@'localhost' identified by 'admin';
Query OK, 0 rows affected (0.00 sec)
mysql> grant create routine,alter routine,execute,select,delete, insert,update on shengang_db.* to 'program'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> grant create routine,alter routine,execute,select,delete,insert, update on shengang_db.* to 'program'@'192.168.2.105';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
1.4.3
[root@localhost mysql]# mysql -uprogram -p
......
mysql> select user();
......
1 row in set (0.00 sec)
# 查看程序账号的权限是否正确
mysql> show grants;
......
2 rows in set (0.00 sec)
mysql> show databases;
......
2 rows in set (0.00 sec)
mysql> use shengang_db
......
mysql> show tables;
......
1 row in set (0.00 sec)
# 查看表结构是否创建正确
mysql> show create table shengang_table;
......
1 row in set (0.00 sec)
mysql> insert into shengang_table(`shengang_test`,`datetime_current`) values('shengang', now());
Query OK, 1 row affected (0.00 sec)
# 查看插入数据是否正确
mysql> select * from shengang_table;
......
1 row in set (0.00 sec)
mysql>
1.5
[root@localhost ~]# cat /home/mysql/conf/my1.cnf
[client]
loose_default-character-set = utf8
port=3306
socket=/home/mysql/data/mysqldata1/sock/mysql.sock
[mysqldump]
quick
max_allowed_packet = 2G
default-character-set = utf8
[mysql]
no-auto-rehash
show-warnings
prompt="\\u@\\h : \\d \\r:\\m:\\s> "
default-character-set = utf8
[myisamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
user=mysql
open-files-limit = 65535
[mysqld]
#large-pages
#*************************common parameters************************
default-storage-engine = INNODB
character-set-server=utf8
collation_server = utf8_bin
log_timestamps=SYSTEM
user=mysql
port=3306
socket=/home/mysql/data/mysqldata1/sock/mysql.sock
pid-file=/home/mysql/data/mysqldata1/sock/mysql.pid
datadir=/home/mysql/data/mysqldata1/mydata
tmpdir=/home/mysql/data/mysqldata1/tmpdir
skip-name-resolve
skip_external_locking
lower_case_table_names=1
event_scheduler=0
back_log=512
default-time-zone='+8:00'
max_connections = 3000
max_connect_errors=99999
max_allowed_packet = 64M
slave_pending_jobs_size_max=128M
max_heap_table_size = 8M
max_length_for_sort_data = 16k
wait_timeout=172800
interactive_timeout=172800
net_buffer_length = 8K
read_buffer_size = 2M
read_rnd_buffer_size = 2M
sort_buffer_size = 2M
join_buffer_size = 4M
binlog_cache_size = 2M
table_open_cache = 4096
table_open_cache_instances = 2
table_definition_cache = 4096
thread_cache_size = 512
tmp_table_size = 8M
# QC系统变量在MySQL 8.0.3版本中被移除
query_cache_size=0
query_cache_type=OFF
#*********************** Logs related settings *********************
log-error=/home/mysql/data/mysqldata1/log/error.log
long_query_time = 1
slow_query_log
slow_query_log_file=/home/mysql/data/mysqldata1/slowlog/slow-query.log
log_slow_slave_statements
#log_queries_not_using_indexes
#********************** Replication related settings ***************
#### For Master
server-id=330614
log-bin=/home/mysql/data/mysqldata1/binlog/mysql-bin
binlog-format=ROW
binlog-checksum=CRC32
binlog-rows-query-log-events=1
binlog_max_flush_queue_time=1000
max_binlog_size = 512M
expire_logs_days=15
sync_binlog=1
master-verify-checksum=1
master-info-repository=TABLE
auto_increment_increment=2
auto_increment_offset=2
# 开启多线程复制之后,如果从库意外挂掉,使用relay_log_recovery=1 crash recovery时会到relay log中查找用于补齐这个gaps的日志信息,如果relay log没有实时落盘,则会导致复制启动可能报ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository的错误,可以使用sync_ relay_log=1来尽量避免。如果不能调整sync_relay_log参数为1,则在报错时需要使用stop slave;change master to master_auto_position=1;start slave;这几条语句让从库清理掉relay log并重新到主库中找位置
# sync_relay_log=1
#### For Slave
relay-log=/home/mysql/data/mysqldata1/relaylog/mysql-relay-bin
relay-log-info-repository=TABLE
relay-log-recovery=1
#slave-skip-errors=1022,1032,1062,1236
slave-parallel-workers=4
slave-sql-verify-checksum=1
log_bin_trust_function_creators=1
log_slave_updates=1
slave-net-timeout=10
#********************** MyISAM Specific options *********************
key_buffer_size = 8M
bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 64M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover_options=force
# ********************** INNODB Specific options ********************
#### Data options
innodb_data_home_dir = /home/mysql/data/mysqldata1/innodb_ts
innodb_data_file_path = ibdata1:2048M:autoextend
innodb_file_per_table
# 以下三个format系统变量在MySQL 8.0中被移除,内部默认使用barracuda
innodb_file_format = barracuda
innodb_file_format_max = barracuda
innodb_file_format_check = ON
innodb_strict_mode = 1
innodb_flush_method = O_DIRECT
innodb_checksum_algorithm=crc32
innodb_autoinc_lock_mode=2
#### Buffer Pool options
innodb_buffer_pool_size = 6G
innodb_buffer_pool_instances = 4
innodb_max_dirty_pages_pct = 75
innodb_adaptive_flushing = ON
innodb_flush_neighbors = 0
innodb_lru_scan_depth = 4096
innodb_change_buffering = all
innodb_old_blocks_time = 1000
innodb_buffer_pool_dump_at_shutdown=ON
innodb_buffer_pool_load_at_startup=ON
# 在MySQL 8.0中被废弃
# innodb_adaptive_hash_index_partitions=32
#### Redo options
innodb_log_group_home_dir = /home/mysql/data/mysqldata1/innodb_log
innodb_log_buffer_size = 128M
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 1
innodb_fast_shutdown = 1
# 在MySQL 8.0中被废弃,内部默认开启XA
innodb_support_xa = ON
#### Transaction options
innodb_thread_concurrency = 64
innodb_lock_wait_timeout = 120
innodb_rollback_on_timeout = 1
transaction_isolation = READ-COMMITTED
#### IO options
performance_schema=on
innodb_read_io_threads = 8
innodb_write_io_threads = 16
innodb_io_capacity = 20000
innodb_use_native_aio = 1
#### Undo options
innodb_undo_directory = /home/mysql/data/mysqldata1/undo/
innodb_undo_tablespaces=4
innodb_undo_log_truncate=ON
innodb_purge_threads = 4
innodb_purge_batch_size = 512
innodb_max_purge_lag = 65536
#### MySQL 5.6
#### GTID
gtid-mode=on # GTID only
enforce-gtid-consistency=true # GTID only
optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on'
#### MySQL 5.7
#super_read_only=on
explicit_defaults_for_timestamp=ON
secure_file_priv=null
slave_parallel_type=LOGICAL_CLOCK
slave_rows_search_algorithms='INDEX_SCAN,HASH_SCAN'
innodb_page_cleaners=4
- 温馨提示:关于文中提到的参数的详细解释,可参考本书下载资源中的“附录C”。
上一篇:书中代码段以及高清大图目录 | 下一篇:第2章 MySQL常用的两种升级方法