mysql 8.0.44 安装基础和备份恢复
参考:【云计算课程之:MySQL数据库运维】https://www.bilibili.com/video/BV1Gp4yz8E5n?p=8&vd_source=31c4d98575f617b03d20657229f04062
1、基础环境准备
- 关闭防火墙
[root@k8smaster ~]# systemctl stop firewalld
[root@k8smaster ~]# systemctl disable firewalld
- 关闭selinux
[root@k8smaster ~]# setenforce 0
[root@k8smaster ~]# sed /etc/selinux/config
[root@k8smaster ~]# sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
- 配置yum环境
[root@k8smaster ~]# yum repolist
2、清理安装
[root@k8smaster ~]# yum remove -y mariadb mariadb-server mariadb-libs mariadb-devel
[root@k8smaster ~]# userdel -r mysql
[root@k8smaster ~]# rm -rf /etc/my*
[root@k8smaster ~]# rm -rf /var/lib/mysql
3、 配置MySQL安装源
[root@k8smaster ~]# cd /opt/tmp/
[root@k8smaster tmp]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@k8smaster tmp]# wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm # 根据操作系统版本去选择rpm包
[root@k8smaster tmp]# rpm -ivh mysql80-community-release-el7-11.noarch.rpm
[root@k8smaster tmp]# yum install yum-utils
[root@k8smaster tmp]# yum install mysql-community-server -y
[root@k8smaster tmp]# yum remove mysql80-community-release
[root@k8smaster tmp]# yum install mysql-community-server -y
[root@k8smaster tmp]# yum repolist enabled | grep mysql # # 应该看到类似输出
mysql80-community/x86_64 MySQL 8.0 Community Server 280
4、安装MySQL数据库
[root@dr1 tmp]# yum install mysql-community-server # 此次依赖包报错,跟操作系统有关系,换了一台机器。
[root@dr1 tmp]# systemctl start mysqld
[root@dr1 tmp]# systemctl enable mysqld
5、查找临时密码
[root@dr1 tmp]# grep password /var/log/mysqld.log
2025-12-25T13:52:49.238244Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: a&vz1?L4*Vvs
6、修改密码
[root@dr1 ~]# mysql -uroot -p'a&vz1?L4*Vvs'
mysql> alter user 'root'@'localhost' identified by 'Test@123';
mysql> flush privileges;
mysql> quit
Bye
还有一种方法 skip-grant-tables
编辑/etc/my.cnf文件,然后重启MySQL。
skip-grant-tables
skip-networking
[root@dr1 tmp]# systemctl restart mysqld
[root@dr1 tmp]# mysql -uroot -p
mysql> FLUSH PRIVILEGES;
mysql> SET PASSWORD FOR 'root'@'localhost' = 'Test@123';
mysql> quit
Bye
注释掉上面的两行配置,重启mysql即可。
二、MySQL数据库基础入门
1、SQL语句简介
记忆技巧:
DDL:Define(定义)结构
DML:Manipulate(操作)数据
DQL:Query(查询)数据
DCL:Control(控制)权限
程序员:DDL + DML + DQL 都用
数据分析师:主要用DQL(查数据)
DBA(数据库管理员):主要用DDL + DCL
普通用户:主要用DQL(查数据)
2、创建数据库表
[root@dr1 ~]# mysql -uroot -p'Test@123'
mysql> CREATE DATABASE school;
mysql> use school;
mysql> create table students(
id int, -- 学号(整数)
name varchar(20),
score int
);
mysql> desc students;
mysql> show create table students;
3、简单实战-成绩表
create table grade(
student_id int,
student_name varchar(20),
chinese_score int,
math_score int
);
mysql> desc grade;
mysql> truncate table grade; # 清空表数据,不清空结果
insert into grade(student_id,student_name,chinese_score,math_score) values (1, '张三', 81, 92);
insert into grade values (2, '周五', 82, 52);
insert into grade values (3, '郑六', 77, 68),(4, '李四', 78, 52);
mysql> select * from grade;
mysql> select student_name,math_score from grade;
mysql> select * from grade where math_score>90;
mysql> select * from grade where student_name='周五';
3、MySQL授权
CREATE DATABASE IF NOT EXISTS testno CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
mysql> CREATE USER IF NOT EXISTS 'testn_admin'@'%' IDENTIFIED BY 'StrongPass123!';
mysql> GRANT ALL PRIVILEGES ON testno.* TO 'testn_admin'@'%' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
mysql> SELECT User, Host FROM mysql.user;
mysql> show grants for 'testno_admin'@'%'; # 查看权限
本地电脑连接:192.168.1.87 3306 testno_admin StrongPass123!
4、常见的数据类型
整数类型 小数:浮点数,定点数 字符串类型:短字符串,文本
5、表的完整性约束
约束类型 主键约束:单主键,复合组件 自增约束 唯一约束 Null 与not Null 约束 默认约束 完整表示例
6、表查询SQL
基础查询 条件查询范围查询 空值查询 排序查询 分组查询 分页查询
三、MySQL数据库备份恢复
1、MySQL备份和恢复基础
数据范围(周期策略):完整备份、增量备份、差异备份
实现方式(备份内容):逻辑备份、物理备份
数据库服务状态(业务影响度):热备份、冷备份、温备份
RTO和RPO
RTO:恢复时间目标,多久可以恢复,通常意味着更快的物理恢复(物理备份,热备)
PRO:恢复点目标,会丢失多少数据,通常需要提供备份频次或实时复制(如增量备份、主从复制)
场景:电商数据库,要求RTO<1小时,RPO<5分钟
推荐策略:
每日凌晨2:00执行一次 数据完全热备份
每4小时执行一次 物理增量热备份
开启MySQL主从复制(实时同步)
使用XtraBackup实现物理热备份与快速恢复
RTO保障:物理备份恢复快,XtraBackup支持快四应用日志,满足1小时内恢复
RPO保障:增量备份频率高(4小时),结合主从复制,实际数据丢失可控制在秒级。
2、物理备份 - XtraBackup
数据库版本: 8.0.44 备份目录
全量备份目录:/backups/full
第一次增量备份目录:/backups/inc1(基于全量备份)
第二次增量备份目录:/backups/inc2(基于第一次增量备份 inc1)
第三次增量备份目录:/backups/inc3(基于第一次增量备份 inc2)
数据目录(datadir):
RPM安装:/var/lib/mysql
源码安装:/usr/local/mysql/data
XtraBackup安装
软件下载:https://www.percona.com/downloads 搜索“Percona XtraBackup 2.4”
选择版本,选择对应的操作系统,不能弄错。参考“Documentation”文档链接。
[root@dr1 tmp]# wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.28/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.28-1.el7.x86_64.rpm
[root@dr1 tmp]# yum localinstall percona-xtrabackup-24-2.4.28-1.el7.x86_64.rpm
[root@dr1 tmp]# xtrabackup --version
xtrabackup: recognized server arguments: --datadir=/var/lib/mysql
xtrabackup version 2.4.28 based on MySQL server 5.7.40 Linux (x86_64) (revision id: 44a8f7b)
###### 如上信息,XtraBackup 2.4.28 对应的 mysql5.7.40,此时需要重新下线高版本的XtraBackup。
deepseek查询官方推荐版本:MySQL 8.0.44,推荐 8.0.33 或更新版本。
[root@dr1 tmp]# yum list installed | grep percona-xtrabackup
[root@dr1 tmp]# yum remove percona-xtrabackup-24-2.4.28-1.el7.x86_64
[root@dr1 tmp]# wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-30/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.35-30.1.el7.x86_64.rpm
XtraBackup会获取/etc/my.cnf配置文件,该文件如有改动重启,会自动识别新的配置。
3、物理备份 - XtraBackup案例
全量备份 -- 准备数据
mysql> CREATE DATABASE IF NOT EXISTS bj1229 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; mysql> use bj1229; mysql> create table tianyun(id int, name varchar(20)); mysql> CREATE USER IF NOT EXISTS 'testn_admin'@'%' IDENTIFIED BY 'StrongPass123!'; mysql> GRANT ALL PRIVILEGES ON bj1229.* TO 'testn_admin'@'%' WITH GRANT OPTION; mysql> flush privileges;
-- 准备存储备份目录 mkdir -p /backups/full [root@dr1 ~]# ls /backups/full/
-- 全量备份
[root@dr1 ~]# xtrabackup --backup --target-dir=/backups/full --user=root --password=Test@123 [root@dr1 ~]# ls /backups/full/ # 查看,还是比较全面的,配置文件my.cnf都有。 backup-my.cnf bj1229 mysql sys xtrabackup_binlog_info xtrabackup_logfile binlog.000023 ib_buffer_pool mysql.ibd undo_001 xtrabackup_checkpoints xtrabackup_tablespaces binlog.index ibdata1 performance_schema undo_002 xtrabackup_info
-- 备份后插入测试数据 mysql> INSERT INTO tianyun VALUES(1, 'user01_full'); mysql> flush privileges;
增量备份1(基于全量备份)
[root@dr1 ~]# xtrabackup --backup --target-dir=/backups/inc1 --incremental-basedir=/backups/full --user=root --password=Test@123 -- 备份后插入测试数据 mysql> INSERT INTO tianyun VALUES(2, 'user02_inc1');
增量备份2(基于第一次增量备份)
[root@dr1 ~]# xtrabackup --backup --target-dir=/backups/inc2 --incremental-basedir=/backups/inc1 --user=root --password=Test@123
-- 备份后插入测试数据
mysql> INSERT INTO tianyun VALUES(3, 'user03_inc2');
增量备份3(基于第二次增量备份)
[root@dr1 ~]# xtrabackup --backup --target-dir=/backups/inc3 --incremental-basedir=/backups/inc2 --user=root --password=Test@123 -- 备份后插入测试数据 mysql> INSERT INTO tianyun VALUES(4, 'user04_inc3');
恢复
备份目录如下
[root@dr1 ~]# ls /backups/
full inc1 inc2 inc3
一次全量,3次增量,需要依次恢复,才可以到达全量恢复的标准。
绝对不能直接将增量备份拷贝到数据目录。必须首先将增量备份应用(Apply)到全量备份上,形成一个统一的、一致的数据镜像。
准备阶段
--准备全备备份 [root@dr1 ~]# xtrabackup --prepare --apply-log-only --target-dir=/backups/full ##### --prepare 进入准备阶段 ##### --apply-log-only 只应用日志,不进行回滚 -- 将第一次增量备份应用恢复到全量备份上 xtrabackup --prepare --apply-log-only --target-dir=/backups/full --incremental-dir=/backups/inc1 -- 将第二次增量备份应用恢复到全量备份上 xtrabackup --prepare --apply-log-only --target-dir=/backups/full --incremental-dir=/backups/inc2 -- 将第三次增量备份应用恢复到全量备份上 xtrabackup --prepare --apply-log-only --target-dir=/backups/full --incremental-dir=/backups/inc3 -- 再次准备全量备份(完成最终回滚) xtrabackup --prepare --target-dir=/backups/full -- 这是关键的一步,确保数据一致性,此时,/backups/full已经是一个包含了所以增量数据的、准备完成备份,可以用于恢复的数据
恢复阶段(物理备份,mysql版本保持一致)
[root@dr1 tmp]# systemctl stop mysqld
[root@dr1 tmp]# grep data /etc/my.cnf datadir=/var/lib/mysql/data [root@dr1 tmp]# rm -fr /var/lib/mysql/* [root@dr1 tmp]# rm -fr /var/lib/mysql/data/*
-- 使用XtraBackup拷贝数据
[root@dr1 tmp]# xtrabackup --copy-back --target-dir=/backups/full
-- 修复文件权限
[root@dr1 ~]# chown -R mysql.mysql /var/lib/mysql/data [root@dr1 ~]# chown -R mysql.mysql /var/lib/mysql
-- 启动,验证
[root@dr1 tmp]# systemctl start mysqld [root@dr1 lib]# tail -f /var/log/mysqld.log # 排错过程需要使用 [root@dr1 lib]# mysql -uroot -p'Test@123' -e 'use bj1229;show tables;' [root@dr1 lib]# mysql -uroot -p'Test@123' bj1229 -e 'show tables;' [root@dr1 lib]# mysql -uroot -p'Test@123' -e 'use bj1229;select * from tianyun;' mysql: [Warning] Using a password on the command line interface can be insecure. +------+-------------+ | id | name | +------+-------------+ | 1 | user01_full | | 2 | user02_inc1 | | 3 | user03_inc2 |
注意事项:
-- 流程:备份-->准备-->停止服务-->清空原有数据-->拷贝数据(恢复)-->改权限-->启动服务 -- 关键参数: -- incremental-basedir: 备份时指定“基备份” -- incremental-dir: 准备时 指定要应用的增量备份 -- apply-log-only: 只应用事务日志,不执行回滚 -- 测试演练:在生产环境进行任何恢复操作之前,一定要在生产环境演练一遍。 如上,可以还原到第三次物理备份状态,只能恢复到备份那一刻时间点。但是之后有写入的怎么办,这个就需要二进制来查看了,涉及到二进制重放的问题。 问题:二进制怎么重放
4、逻辑备份 - mysqldump
物理备份时最快的,但是小型数据库使用mysqldump
优点: 兼容性好,支持跨技术、跨平台操作 可灵活备份单个表、数据库或全部数据库 缺点: 恢复速度比较慢(需要执行SQL语句) 大量数据时备份文件比较大 备份期间可能影响数据库性能
基本使用
基本语法 mysqldump -h 主机名 -u 用户名 -p密码 数据库名 >备份文件.sql
[root@dr1 ~]# mysqldump -uroot -p'Test@123' bj1229 >/tmp/bj1229.sql -- 备份
[root@dr1 ~]# mysql -uroot -p'Test@123' -e 'drop database bj1229' -- 删除
-- 恢复
[root@dr1 ~]# mysql -uroot -p'Test@123' -e 'create database bj1229'
[root@dr1 ~]# mysql -uroot -p'Test@123' bj1229 < /tmp/bj1229.sql
4、逻辑备份 - mysqldump案例
[root@dr1 ~]# cat company.sql
-- 创建测试数据库和表
CREATE DATABASE IF NOT EXISTS company;
use company;
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`id` int PRIMARY KEY AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`department` varchar(50),
`salary` decimal(10,2),
`hire_date` date
);
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
`id` int PRIMARY KEY AUTO_INCREMENT,
`dept_name` varchar(50) UNIQUE NOT NULL,
`manger` varchar(50)
);
-- 插入数据
INSERT INTO employee VALUES ('1', '杨哥', '技术部', '15000.00', '2025-01-15');
INSERT INTO employee VALUES ('2', 'alice', '销售部', '12000.00', '2025-02-20');
INSERT INTO employee VALUES ('3', '阔哥', '技术部', '18000.00', '2022-11-10');
INSERT INTO department VALUES ('1', '技术部', '阔哥');
INSERT INTO department VALUES ('2', '销售部', 'alice');
--方法一: mysql -uroot -p'Test@123' <company.sql --方法二: mysql -uroot -p'Test@123' -e 'source /root/company.sql'
备份表
备份单表:mysqldump -uroot -p'Test@123' company employee>/tmp/company.employee.sql 备份多个表:mysqldump -uroot -p'Test@123' company employee department>/tmp/company.employee_department.sql
备份数据库
备份单个数据库:mysqldump -uroot -p'Test@123' company >/tmp/company_full.sql 备份单个数据库:mysqldump -uroot -p'Test@123' -B company >/tmp/company_full.sql 备份多个数据库:mysqldump -uroot -p'Test@123' -B company bj1229 >/tmp/company_bj1229.sql 备份所有数据库:mysqldump -uroot -p'Test@123' -A >/tmp/all_databases.sql 参数解析: -B, --databases 备份多个数据库 -A, --all-databases 备份所有数据库
高级备份选项
##### 保证数据一致性(推荐用于innodb) mysqldump -uroot -p'Test@123' --single-transaction company >/tmp/company.consistent.sql ##### 刷新binlog日志(用于增量备份场景) mysqldump -uroot -p'Test@123' -F --single-transaction company >/tmp/company.with_flush.sql ##### 压缩备份 mysqldump -uroot -p'Test@123' company |gzip>/tmp/company.sql.gz ##### 参数 --flush-logs,-F 刷新binlog日志
生产环境示例:
[root@dr1 ~]# mysqldump -uroot -p'Test@123' -F --single-transaction --routines --events --triggers --flush-logs --source-data=2 --databases company bj1229 >/tmp/company_bj1229_$(date +%Y%m%d).sql
恢复操作
恢复前准备
注意:在恢复数据的会话中,先关闭binlog。 set sql_log_bin=0;
恢复数据库
##### 恢复完整的数据库 mysql -uroot -p'Test@123' < /tmp/company_full.sql ##### 方法一:使用选项(推荐) mysql -uroot -p'Test@123' --disable-log-bin company < /tmp/company_full.sql ##### 方法二:在恢复临时禁用二进制日志记录 mysql -uroot -p'Test@123' -e 'set sql_log_bin=0;source /tmp/company_full.sql'
恢复表
知识改变命运,努力创造奇迹~
浙公网安备 33010602011771号