项目三:企业数据库用户权限管理
企业背景
公司数据库管理员需要给不同岗位分配权限。
需求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.17MySQL 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=1cmake 配置编译参数这是最关键的一步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-reloadsystemctl start mysqld.servicesystemctl enable mysqldnetstat -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.comntpdate 192.168.64.11crontab -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 TOMASTER_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-backupcp -a /usr/local/nginx/conf /data/nginx-backup/conf-$(date +%F)cp -a /usr/local/nginx/sbin/nginx /data/nginx-backup/nginx-1.202. 检查当前配置
/usr/local/nginx/sbin/nginx -t必须看到:
syntax is ok
test is successful
3. 下载并编译 Nginx 1.22
cd /usr/local/srcwget http://nginx.org/download/nginx-1.22.1.tar.gztar -zxf nginx-1.22.1.tar.gzcd 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-vtsmake -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 nginx2. 替换 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/nginxchmod 755 /usr/local/nginx/sbin/nginx3. 检查配置并启动
/usr/local/nginx/sbin/nginx -tsystemctl start nginx如果没有 systemd:
/usr/local/nginx/sbin/nginx4. 验证升级结果
/usr/local/nginx/sbin/nginx -vsystemctl status nginxcurl -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/nginxchmod 755 /usr/local/nginx/sbin/nginx3. 向旧主进程发送 USR2 信号
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)此时旧主进程会保留为 nginx.pid.oldbin,同时启动新主进程。
查看进程:
ps -ef | grep nginx检查新旧主进程是否同时存在:
cat /usr/local/nginx/logs/nginx.pidcat /usr/local/nginx/logs/nginx.pid.oldbin4. 停止旧工作进程
确认新主进程和新工作进程正常后,执行:
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 -vps -ef | grep nginxcurl -I http://127.0.0.1应确认:
五、回滚方案
停机升级回滚
systemctl stop nginxcp -a /data/nginx-backup/nginx-1.20 /usr/local/nginx/sbin/nginxcp -a /data/nginx-backup/conf-升级日期/* /usr/local/nginx/conf//usr/local/nginx/sbin/nginx -tsystemctl 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