MySQL 主从复制与 Nginx 升级实践记录
2026/8/3 11:00:41 网站建设 项目流程

项目三:企业数据库用户权限管理

企业背景

公司数据库管理员需要给不同岗位分配权限。


需求1:创建数据库账号

创建用户:

数据库管理员:dba

密码:123456

要求:

允许:任意IP连接。

需求2:创建开发人员账号

用户:developer

要求:

只能操作:company_hr数据库。

权限:

允许:SELECT、INSERT、UPDATE

禁止:DROP、DELETE

需求3:创建只读账号

用户:readonly

要求:

只能查询:shop数据库。

需求4:权限检查

完成:

1. 查看用户权限

2. 查看授权结果

3. 回收用户权限


项目四:企业多表连接查询实战

企业背景

公司员工信息分开存储:

员工表:employee

部门表:department


需求1:查询员工和部门信息

要求:

显示:员工姓名、部门名称、办公地点

需求2:查询所有员工

包括:没有部门信息的员工。

要求:

使用左连接


需求3:查询所有部门

包括:

没有员工的部门。

要求:

使用右连接


需求4:统计部门人数

输出:

| 部门 | 人数 |

| --- | -- |

| 技术部 | 3 |

| 运维部 | 5 |


项目五:企业数据库备份练习

企业需求

每天凌晨需要备份员工数据库。

需要完成:


需求1:

复制员工表结构。


需求2:

复制员工表结构和数据。


需求3:

创建员工历史备份表:employee_backup

MySQL 一主两从复制搭建实施文档

说明:本文记录 CentOS 7 环境下 MySQL 源码编译安装、时间同步配置、一主两从复制搭建,以及 Nginx 传统升级和平滑升级的操作流程。文中的 IP 按本地实验环境 192.168.64.11、192.168.64.12、192.168.64.13 编写。

一主两从版本

1,三个mysql编译安装同版本的,这里把编译安装归为一个完整步骤说明。

yum install -y gcc gcc-c++ make cmake ncurses-devel bison openssl-devel

安装编译 MySQL 需要的基础工具和库

useradd -r -s /sbin/nologin mysql

创建 mysql 系统用户,不允许登录系统,只给 MySQL 服务运行用

cd /root

进入源码包所在目录

tar -zxvf mysql-5.7.17.tar.gz

如果是.zip,unzip 文件.zip,如果是.tar.bz2,就tar -jxvf 文件.tar.bz2

解压 MySQL 源码包

cd mysql-5.7.17

MySQL 5.7 编译需要 boost。你如果是 mysql-boost-5.7.20.tar.gz 那种包,里面可能自带

boost;如果是普通 mysql-5.7.17.tar.gz,需要提前有 boost。

mkdir -p /usr/local/boost

如果有boost 包:

tar -zxvf /root/boost_1_59_0.tar.gz -C /usr/local/boost --strip-components=1
cmake 配置编译参数这是最关键的一步
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_BOOST=/usr/local/boost \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DEXTRA_CHARSETS=all \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_SYSTEMD=1

生成 Makefile,指定安装目录、数据目录、配置文件目录、字符集、存储引擎、systemd 支持

如果 cmake 报错,先清缓存再重新 cmake:

rm -f CMakeCache.txt

删除上一次失败的 cmake 缓存

rm -rf CMakeFiles

删除上一次失败的 cmake 临时目录

make -j$(nproc)开始编译,-j$(nproc) 表示按 CPU 核心数并行编译
make install

把编译好的 MySQL 安装到 /usr/local/mysql

到这一步,只是“程序文件安装完成”。还不能算 MySQL 服务完整可用,因为还没配置、初始化数据目录、注册服务。

chown -R mysql:mysql /usr/local/mysql

把 MySQL 安装目录交给 mysql 用户管理

echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile

把 MySQL 命令加入系统 PATH

source /etc/profile

让 PATH 立即生效

mysql --version

创建 /etc/my.cnf

vim /etc/my.cnf

[mysqld]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

socket=/usr/local/mysql/mysql.sock

pid-file=/usr/local/mysql/mysqld.pid

port=3306

user=mysql

character-set-server=utf8mb4

collation-server=utf8mb4_general_ci

skip-name-resolve

[client]

socket=/usr/local/mysql/mysql.sock

default-character-set=utf8mb4

然后保存,wq退出

chown mysql:mysql /etc/my.cnf

让 mysql 用户能读取配置文件

数据库初始化

cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data

服务管理

cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl start mysqld.service
systemctl enable mysqld
netstat -anpt | grep 3306

账号密码管理

设置 root 密码:

mysqladmin -uroot password "123456"

登录:mysql -uroot -p123456

2.配置时间同步

[root@master ~]# yum -y install ntpdate ntp #安装ntp软件

[root@master ~]# ntpdate ntp.aliyun.com #时间同步

[root@master ~]# vim /etc/ntp.conf #编辑配置文件

fudge 127.127.1.0 stratum 10

#设置本机的时间层级为10级,0级表示时间层级为0级,是向其他服务器提供时间同步源的意思,不要设置为0

server 127.127.1.0 #设置本机为时间同步源

三台机器同样关闭防火墙和增强功能

[root@master ~]# systemctl start ntpd

[root@master ~]# systemctl stop firewalld.service

[root@master ~]# setenforce 0

从 配置时间

systemctl stop ntpd

[root@localhost ~]# yum install ntp ntpdate -y

[root@localhost ~]# ntpdate 192.168.64.11

两台从服务器配置相同

#master服务器同步阿里云时钟服务器

ntpdate ntp.aliyun.com
ntpdate 192.168.64.11
crontab -e

*/10 * * * * /usr/sbin/ntpdate 192.168.64.11

主服务器修改配置文件(192.168.64.11)

[root@master ~]# vim /etc/my.cnf

#在mysqld模块下修改一下内容

#开启二进制日志文件(之后生成的日志名为master-bin)

log_bin=master-bin

#开启从服务器日志同步

log_slave-updates=true

#主服务器id为1(不可重复)

server_id = 1

保存退出:wq

重启服务

[root@master ~]# systemctl restart mysqld

[root@master ~]# mysql -uroot -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.64.%' IDENTIFIED BY '123456';

Query OK, 0 rows affected (0.00 sec)

#刷新权限表

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

查看master数据库状态

show master status;

从服务器配置(192.168.64.12 和 192.168.64.13 基本一样,只是 server_id 不能重复)

[root@slave1 ~]# vim /etc/my.cnf

#开启二进制日志文件

log-bin=master-bin

#设置server_id 为 22,第二台从库为 23

server_id = 22

#从主服务器上同步日志文件记录到本地

relay-log=relay-log-bin

#定义relay-log的位置和名称(index索引)

relay-log-index=slave-relay-bin.index

保存退出:wq

然后记得重启systemctl restart mysqld

开启从服务器功能

[root@slave1 ~]# mysql -uroot -p

然后

CHANGE MASTER TO
MASTER_HOST='192.168.64.11',
MASTER_USER='myslave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master-bin.000003',
MASTER_LOG_POS=603;

关闭io进程

STOP SLAVE;(如果之前已经启动过复制,先停掉再重新配置)

START SLAVE; 启动复制
SHOW SLAVE STATUS\G; 查看从服务器状态

Nginx 1.20 升级到 1.22:停机升级和平滑升级流程

一、升级说明

目标:将 Nginx 1.20 升级为 1.22。

以下示例假设 Nginx 安装在

/usr/local/nginx

,配置文件为

/usr/local/nginx/conf/nginx.conf

,主进程 PID 文件为

/usr/local/nginx/logs/nginx.pid

先确认当前版本:

/usr/local/nginx/sbin/nginx -v

二、升级前准备

1. 备份配置和程序

mkdir -p /data/nginx-backup
cp -a /usr/local/nginx/conf /data/nginx-backup/conf-$(date +%F)
cp -a /usr/local/nginx/sbin/nginx /data/nginx-backup/nginx-1.20

2. 检查当前配置

/usr/local/nginx/sbin/nginx -t

必须看到:

syntax is ok

test is successful

3. 下载并编译 Nginx 1.22

cd /usr/local/src
wget http://nginx.org/download/nginx-1.22.1.tar.gz
tar -zxf nginx-1.22.1.tar.gz
cd nginx-1.22.1

获取旧版本编译参数,避免丢失模块:

/usr/local/nginx/sbin/nginx -V 2>&1

根据旧版本输出执行配置。例如:

./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-compat \
--with-file-aio \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_flv_module \
--with-http_ssl_module \
--with-http_v2_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--add-dynamic-module=/opt/nginx-module-vts

make -j$(nproc)

编译完成后先确认新程序版本:

./objs/nginx -v

应显示:

nginx version: nginx/1.22.1

三、传统升级:停机升级

1. 停止旧 Nginx

如果使用 systemd:

systemctl stop nginx

如果没有 systemd:

/usr/local/nginx/sbin/nginx -s stop

确认进程已经停止:

ps -ef | grep nginx

2. 替换 Nginx 程序

先保存旧程序:

cp -a /usr/local/nginx/sbin/nginx /data/nginx-backup/nginx-1.20-$(date +%F-%H%M%S)

再替换为新程序:

cp ./objs/nginx /usr/local/nginx/sbin/nginx
chmod 755 /usr/local/nginx/sbin/nginx

3. 检查配置并启动

/usr/local/nginx/sbin/nginx -t
systemctl start nginx

如果没有 systemd:

/usr/local/nginx/sbin/nginx

4. 验证升级结果

/usr/local/nginx/sbin/nginx -v
systemctl status nginx
curl -I http://127.0.0.1

传统升级期间客户端会出现短暂连接失败,适合维护窗口执行。

四、平滑升级:在线升级

平滑升级必须使用与旧版本相同的安装路径、配置路径和 PID 路径。

1. 编译新版本

按照前面的步骤完成 Nginx 1.22 编译,但暂时不要覆盖正在运行的旧程序。

确认新程序:

./objs/nginx -v

./objs/nginx -t -c /usr/local/nginx/conf/nginx.conf

2. 备份旧程序并替换二进制文件

cp -a /usr/local/nginx/sbin/nginx /data/nginx-backup/nginx-1.20-$(date +%F-%H%M%S)
cp ./objs/nginx /usr/local/nginx/sbin/nginx
chmod 755 /usr/local/nginx/sbin/nginx

3. 向旧主进程发送 USR2 信号

kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)

此时旧主进程会保留为 nginx.pid.oldbin,同时启动新主进程。

查看进程:

ps -ef | grep nginx

检查新旧主进程是否同时存在:

cat /usr/local/nginx/logs/nginx.pid
cat /usr/local/nginx/logs/nginx.pid.oldbin

4. 停止旧工作进程

确认新主进程和新工作进程正常后,执行:

kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin)

WINCH 会让旧工作进程平滑退出,已经建立的连接会继续处理。

5. 退出旧主进程

确认业务访问正常后:

kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)

检查旧 PID 文件是否消失:

ls /usr/local/nginx/logs/nginx.pid.oldbin

如果文件不存在,说明旧主进程已经退出。

6. 验证在线升级

/usr/local/nginx/sbin/nginx -v

ps -ef | grep nginx
curl -I http://127.0.0.1

应确认:

五、回滚方案

停机升级回滚

systemctl stop nginx
cp -a /data/nginx-backup/nginx-1.20 /usr/local/nginx/sbin/nginx
cp -a /data/nginx-backup/conf-升级日期/* /usr/local/nginx/conf/
/usr/local/nginx/sbin/nginx -t
systemctl start nginx

平滑升级回滚

如果新版本异常,在旧主进程仍存在时执行:

kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid)
mv /usr/local/nginx/logs/nginx.pid.oldbin /usr/local/nginx/logs/nginx.pid

恢复旧程序:

cp -a /data/nginx-backup/nginx-1.20 /usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx -t

然后启动或恢复旧服务:

/usr/local/nginx/sbin/nginx

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询