本文简述 Linux 环境下 MySQL 的安装与配置方法.

CentOS 7.0 + MySQL 5.7 Community

1. 配置 yum 源

在 MySQL 官网中下载 yum 源 rpm 安装包: http://dev.mysql.com/downloads/repo/yum/

1
2
3
4
# 下载mysql源安装包
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
# 安装mysql源
yum localinstall mysql57-community-release-el7-8.noarch.rpm

检查 MySQL 源是否安装成功

1
2
3
4
5
6
yum repolist enabled | grep "mysql.*-community.*"

# 看到如下信息即说明MySQL源安装成功
mysql-connectors-community/x86_64 MySQL Connectors Community 153
mysql-tools-community/x86_64 MySQL Tools Community 110
mysql57-community/x86_64 MySQL 5.7 Community Server 424

可以修改 /etc/yum.repos.d/mysql-community.repo , 以改变默认安装的 mysql 版本

2. 安装 MySQL

1
yum install mysql-community-server

默认配置文件路径:
配置文件:/etc/my.cnf
日志文件:/var/log//var/log/mysqld.log
服务启动脚本:/usr/lib/systemd/system/mysqld.service
socket文件:/var/run/mysqld/mysqld.pid

3. 启动 MySQL 服务

1
2
3
systemctl start mysqld				# 启动
systemctl status mysqld # 查看服务状态
systemctl restart mysqld # 重启

4. 设置开机启动

1
2
systemctl enable mysqld
systemctl daemon-reload

5. 修改 root 本地登录密码

MySQL 安装完成之后可使用如下命令在 /var/log/mysqld.log 文件中生成了一个 root 账号的临时密码.

1
grep 'temporary password' /var/log/mysqld.log

使用生成的临时密码登录 MySQL 后修改成别的密码即可.

1
2
3
4
5
6
mysql -uroot -p

# 注意下面是登录进入MySQL后的操作
mysql> set password for 'root'@'localhost'=password('NewPassword');
# 或者
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';

mysql 5.7 默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。否则会提示 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

若非要使用简单的密码, 可修改密码策略, 在 /etc/my.cnf 文件如下代码, 重启后 MySQL 服务 ( systemctl restart mysqld ) 后生效.

1
2
# 选择0(LOW), 1(MEDIUM), 2(STRONG)其中一种,选择2需要提供密码字典文件
validate_password_policy=0

6. 常用配置

通过修改 /etc/my.cnf 文件,在 [mysqld] 下添加配置完成. 具体用法看注释. 修改配置后记得重启 MySQL 服务.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[mysqld]

# 配置默认编码为utf8
character_set_server=utf8
init_connect='SET NAMES utf8'

# 更改默认监听端口
port=3906

# 允许远程连接本机的MySQL
# 还须登录进入MySQL添加远程连接账户
# mysql> GRANT ALL PRIVILEGES ON *.* TO '登录名'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
# 注意防火墙配置
bind-address=0.0.0.0

# 最大连接数
max_user_connections=30 # 单用户最大连接数
max_connections=1000 # 全局最大连接数

6. 查看配置与状态

登录进入 MySQL 后

  • show variables like '%变量名%' 可查看 MySQL 的配置信息, 通常可通过*/etc/my.cnf* 文件进行配置.
  • show status like '%变量名%' 可查看 MySQL 状态

以下是常用命令:

1
2
3
4
5
6
7
8
9
# 查看默认字符编码
mysql> show variables like '%character%';
# 查看端口
mysql> show variables like '%port%';

# 查看当前处于连接状态的进程列表, 不加full选项则最多显示100条记录
mysql> show full processlist;
# 查看连接数
mysql> show status like 'Threads%';

7. 备份与恢复

1
2
3
4
5
6
7
# 不带存储过程备份
mysqldump -uroot -p dbName > ~\dbName.dmp
# 带存储过程备份
mysqldump -uroot -p --opt -R dbName > ~\dbName.dmp

# 恢复数据库
mysql -u root -p dbName < ~\dbName.dmp

上面代码中 dbName 为数据库名.

7.1 定时自动备份

7.1.1 创建目录

1
2
3
mkdir -p /data/mysqlbak/data
mkdir -p /data/mysqlbak/scripts
mkdir -p /data/mysqlbak/logs

7.1.2 自动备份

  • 创建备份脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
cd /data/mysqlbak/scripts
vi backup.sh

#!/bin/bash

# 备份目录
BACKUP_ROOT=/data/mysqlbak
BACKUP_FILEDIR=$BACKUP_ROOT/data

# 当前日期
DATE=$(date +%Y%m%d)

######备份######

# 查询所有数据库
# -uroot -p123456表示使用root账号执行命令,且root账号的密码为:123456
DATABASES=$(mysql -uroot -p123456 -e "show databases" | grep -Ev "Database|sys|information_schema|performance_schema|mysql")
# 循环数据库进行备份
for db in $DATABASES
do
echo
echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz BEGIN----------
mysqldump -uroot -p123456 --default-character-set=utf8 -q --lock-all-tables --flush-logs -E -R --triggers -B ${db} | gzip > $BACKUP_FILEDIR/${db}_$DATE.sql.gz
echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz COMPLETE----------
echo
done

echo "done"
  • 设置备份脚本执行权限

    1
    chmod 777 backup.sh
  • 将备份操作加入到定时任务(每天凌晨2点执行)

    1
    2
    3
    crontab -e

    00 2 * * * /data/mysqlbak/scripts/backup.sh > /data/mysqlbak/logs/backup.log 2>&1
  • 查看定时任务

    1
    crontab -l

7.1.2 自动删除备份

  • 创建删除脚本(删除7天前的备份数据)

    1
    2
    3
    4
    5
    6
    vi backup_clean.sh

    #!/bin/bash
    echo ----------CLEAN BEGIN----------
    find /data/mysqlbak/data -mtime +7 -name "*.gz" -exec rm -rf {} \;
    echo ----------CLEAN COMPLETE----------
  • 设置删除脚本执行权限

    1
    chmod 777 backup_clean.sh
  • 将删除备份操作加入到定时任务(每天凌晨1点执行)

    1
    00 1 * * * /data/mysqlbak/scripts/backup_clean.sh > /data/mysqlbak/logs/backup_full_clean.log 2>&1

7.1.3 备份到远程机器

通过上述方法备份完成后, 可通过 scp 拷贝到另一台机器

1
2
# 需要安装 expect
yum install expect

修改备份脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash

# 备份目录
BACKUP_ROOT=/data/mysqlbak
BACKUP_FILEDIR=$BACKUP_ROOT/data

# 当前日期
DATE=$(date +%Y%m%d)

######备份######

# 查询所有数据库
# -uroot -p123456表示使用root账号执行命令,且root账号的密码为:123456
DATABASES=$(mysql -uroot -p123456 -e "show databases" | grep -Ev "Database|sys|information_schema|performance_schema|mysql")
# 循环数据库进行备份
for db in $DATABASES
do
echo
echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz BEGIN----------
mysqldump -uroot -p123456 --default-character-set=utf8 -q --lock-all-tables --flush-logs -E -R --triggers -B ${db} | gzip > $BACKUP_FILEDIR/${db}_$DATE.sql.gz
echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz COMPLETE----------

# 通过SCP拷贝到远程机器的指定目录
# xxx.xxx.xxx.xxx 远程机器的IP
# /data/mysqlbak/ 远程机器备份目录
echo ---------- SCP BEGIN ----------
expect -c "
spawn scp -r /data/mysqlbak/data/${db}_$DATE.sql.gz root@xxx.xxx.xxx.xxx:/data/mysqlbak/
expect {
\"*assword\" {set timeout 300; send \"此处是scp的密码\r\"; exp_continue;}
\"yes/no\" {send \"yes\r\";}
}
expect eof"
echo ---------- SCP END ----------
echo
done

echo "done"


参考:

[1] https://blog.csdn.net/xyang81/article/details/51759200

[2] https://www.cnblogs.com/blazeZzz/p/10881297.html