mysql 8.0.44 安装基础和备份恢复

一、MySQL安装

参考:【云计算课程之: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版本保持一致)

-- 停止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'

恢复表 同恢复数据库一致,不需要过多讲解。

posted @ 2026-01-06 16:57  wang_wei123  阅读(42)  评论(0)    收藏  举报