当前位置: 首页 > news >正文

Mysql bin-log日志恢复数据与物理备份-xtrabackup

主打一个数据备份与恢复

binlog与xtarbackup

  • bin-log日志恢复
    • 开启bin-log配置
    • bin-log日志恢复
  • 物理备份-xtrabackup
    • 三种备份方式
    • 安装xtrabackup
    • 备份
      • 全量备份
      • 增量备份
      • 差异备份

bin-log日志恢复

bin-log 日志,就记录对数据库进行的操作,什么增删改的操作全都在 bin-log 日志中,首先需要开启bin-log日志文件

开启bin-log配置

在这里插入图片描述

  • 如图:在mysql的配置文件中的 [mysqld] 添加下面的配置
vim /etc/my.cnf   # 不同的操作系统的配置文件不一样server_id=10   # 不指定,可随意写一个数
log-bin=/var/lib/mysql/mysql-bin.log
  • 添加上面的配置之后需要重启一下
systemctl restart mysqld
  • 重启之后在/var/lib/mysql 目录下面有一个 mysql_bin.00001 文件 在这里插入图片描述
  • 在mysql中可以刷新bin-log日志
mysql> flush logs;
  • 可以使用下面的查看当前使用的是哪一个 bin-log 日志文件
mysql> show master status+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      777 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

bin-log日志恢复

  • 查看bin-log日志
mysql> select * from school.student;
+----+--------+------+
| id | name   | sex  |
+----+--------+------+
|  1 | 小温   ||
|  2 | 小成   ||
+----+--------+------+
2 rows in set (0.00 sec)mysql> delete from school.student;
Query OK, 2 rows affected (0.00 sec)
#  上面是删除表中的两条记录
# 查看 bin-log 日志文件中对应的操作
mysqlbinlog --base64-output=decode-rows /var/lib/mysql/mysql-bin.000003 -vv
BEGIN
  • 这个图片是课件里面的,只供展示
    这个是课件里面的,只供展示

  • 里面有好多,我只截取上面对应的一部分的日志

/*!*/;
# at 927
#230926  0:48:58 server id 10  end_log_pos 991 CRC32 0x55632c6b         Table_map: `school`.`student` mapped to number 83
# has_generated_invisible_primary_key=0
# at 991
#230926  0:48:58 server id 10  end_log_pos 1052 CRC32 0x67d51427        Delete_rows: table id 83 flags: STMT_END_F
### DELETE FROM `school`.`student`
### WHERE
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='小温' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
###   @3=1 /* ENUM(1 byte) meta=63233 nullable=1 is_null=0 */
### DELETE FROM `school`.`student`
### WHERE
###   @1=2 /* INT meta=0 nullable=0 is_null=0 */
###   @2='小成' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
###   @3=2 /* ENUM(1 byte) meta=63233 nullable=1 is_null=0 */
# at 1052
#230926  0:48:58 server id 10  end_log_pos 1083 CRC32 0x6eb05b5b        Xid = 132
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
  • 如果要恢复对应的数据,必须找到对应的添加语句
BEGIN
/*!*/;
# at 634
#230925 19:52:16 server id 10  end_log_pos 698 CRC32 0x26fba24f         Table_map: `school`.`student` mapped to number 83
# has_generated_invisible_primary_key=0
# at 698
#230925 19:52:16 server id 10  end_log_pos 746 CRC32 0x88535582         Write_rows: table id 83 flags: STMT_END_F
### INSERT INTO `school`.`student`
### SET
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='小温' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
###   @3=1 /* ENUM(1 byte) meta=63233 nullable=1 is_null=0  */
# at 746
#230925 19:52:16 server id 10  end_log_pos 777 CRC32 0xd1f2f433         Xid = 96
COMMIT/*!*/;
# at 777
#230926  0:48:58 server id 10  end_log_pos 856 CRC32 0x842fc928         Anonymous_GTID  last_committed=2        sequence_number=3       rbr_only=yes    original_committed_timestamp=1695660538233698     immediate_commit_timestamp=1695660538233698     transaction_length=306
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1695660538233698 (2023-09-26 00:48:58.233698 CST)
# immediate_commit_timestamp=1695660538233698 (2023-09-26 00:48:58.233698 CST)
/*!80001 SET @@session.original_commit_timestamp=1695660538233698*//*!*/;
/*!80014 SET @@session.original_server_version=80034*//*!*/;
/*!80014 SET @@session.immediate_server_version=80034*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 856
#230926  0:48:58 server id 10  end_log_pos 927 CRC32 0xf9ee8b28         Query   thread_id=18    exec_time=0     error_code=0
SET TIMESTAMP=1695660538/*!*/;
SET @@session.sql_mode=1168113696/*!*/;
BEGIN
  • 上面是添加数据对应的日志
  • 要恢复的话需要使用下面的这条语句
mysqlbinlog --start-position 634 --stop-position 927 /var/lib/mysql/mysql-bin.000003 | mysql -uroot -p1# 其中 634 是上面日志文件有个 at 634 相当于从这个时刻开始到 927 这个时刻
# 需要注意的是,在这个里面必须将 COMMITTED 事务提交语句也得包含起来
  • 当然,还可以使用时间来恢复数据
mysqlbinlog --start-datetime='2019-8-21 23:55:54' --stop-datetime='2019-8-21 23:56:541' mylog.000001 | mysql -u root -p1

物理备份-xtrabackup

物理备份: 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。

三种备份方式

  • 全量备份-----完整备份:

每次都将所有数据(不管自第一次备份以来有没有修改过),进行一次完整的复制,备份后会清除文件的存档属性,方便日后增量备份或者差异备份进行版本比较。
特点:占用空间大,备份速度慢,但恢复时一次恢复到位,恢复速度快。

  • 增量备份: 每次备份上一次备份到现在产生的新数据

在第一次完整备份之后,第二次开始每次都将添加了存档属性的文件进行备份,并且在备份之后再把这些存档属性清除。为什么要清除存档属性呢?这就是为了下一次备份的时候判断是否有文件变化,因为用户在每次备份以后修改这些被清除存档属性的文件,存档属性就会自动加上,相当于用户告诉系统,这些文件有变化,你下一次就备份这些文件,其他没有存档属性的就不需要备份,这就是增量备份的工作机制。

特点:因每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件,所 以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢 复,恢复时间长。

  • 差异备份:只备份跟完整备份不一样的

在第一次完整备份之后,第二次开始每次都将所有文件与第一次完整备份的文件做比较,把自第一次完整备份以来所有修改过的文件进行备份,且以后每次备份都是和第一次完整备份进行比较(注意是第一次,不是上一次),备份自第一次完整备份以来所有的修改过的文件。
特点:占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后一次的差异版本,恢复速度介于完整备份和增量备份之间。


简单的讲,完整备份就是不管三七二十一,每次都把指定的备份目录完整的复制一遍,不管目录下的文件有没有变化;增量备份就是每次将之前(第一次、第二次、直到前一次)做过备份之后有变化的文件进行备份;差异备份就是每次都将第一次完整备份以来有变化的文件进行备份。

安装xtrabackup

官网:www.percona.com

  • 下载
    在这里插入图片描述
    在这里插入图片描述
    点击这个下载,然后复制到linux系统中解压
  • 安装
# 解压后进入对应文件夹里面
yum install -y *.npm  # 安装

备份

全量备份

  • 备份
# 创建备份目录
mkdir /xtrabackup/full -p
# 全量备份 
innobakeupex --user=root --password='1' /xtrabackup/full
  • 恢复
# 1.关闭数据库
systemctl stop mysqld
# 2.清理数据 
rm -rf /var/lib/mysql/*
# 3.恢复之前验证数据
innobackupex -apply-log /xtrabackup/full/对应的文件
# 4.恢复数据 恢复数据前需要将 bin-log 配置修改 将bin-log的文件目录修改为其他地方,
# 也可以将 bin-log 配置项注释掉
innobackupex --copy-back /xtrabackup/full/文件
# 5.修改权限
chown mysql.mysql  /var/lib/mysql -R

增量备份

原理:每次备份上一次备份到现在产生的新数据

  • 全量备份第一天的
innobackupex --user=root --password='1' /xtrabackup/full
  • 增量备份第二天的
innobackupex --user=root --password='1' --incremental /xtrabackup/ --incremental-basedir=/xtrabackup/第一天备份的文件夹
  • 增量备份第三天的
innobackupex --user=root --password='1' --incremental /xtarbackup/ --incremental-basedir=/xtrabackup/第二天备份的文件
  • 恢复文件
# 1.关闭mysql
systemctl stop mysqld
# 2.清除数据
rm -rf /var/lib/mysql/*
# 3.依次重演备份文件
innobackupex --apply-log --redo-only /xtarbackup/第一天备份文件
# 之后的重演相当于将数据放到了第一天备份文件上
innobackupex --apply-log --redo-only /xtrabackup/第一天备份文件 --incremental-dir=/xtrabackup/第二天备份文件
innobackupex --apply-log --redo-only /xtrabackup/第一天备份文件 --incremental-dir=/xtrabackup/第三天备份文件
# 4.恢复数据
innobackupex --copy-back /xtarbackup/第一天备份文件
# 5.修改权限
chown mysql.mysql -R /var/lib/mysql/*
# 6.启动数据库
systemctl start mysqld

差异备份

  • 全量备份第一天的
innobackupex --user=root --password='1' /xtarbackup/
  • 第二到四天全不备份 第五天备份前面全部的数据,除外第一天
innobackupex --user=root --password='1' --incremental /xtarbackup/ --incremental-basedir=/xtarbackup/第一天备份的文件夹
  • 恢复数据
# 1.关闭mysql
systemctl stop mysqld
# 2.清除数据
rm -rf /var/lib/mysql/*
# 3.依次重演备份文件
innobackupex --apply-log --redo-only /xtarbackup/第一天备份文件
innobackupex --apply-log --redo-only /xtarbackup/第一天备份文件 --incremental-dir=/xtarbackup/第五天备份文件
# 4.恢复数据
innobackupex --copy-back /xtarbackup/第一天备份文件
# 5.修改权限
chown mysql.mysql -R /var/lib/mysql/*
# 6.启动数据库
systemctl start mysqld

相关文章:

Mysql bin-log日志恢复数据与物理备份-xtrabackup

主打一个数据备份与恢复 binlog与xtarbackup bin-log日志恢复开启bin-log配置bin-log日志恢复 物理备份-xtrabackup三种备份方式安装xtrabackup备份全量备份增量备份差异备份 bin-log日志恢复 bin-log 日志,就记录对数据库进行的操作,什么增删改的操作全…...

JAVA 学习笔记 2年经验

文章目录 基础String、StringBuffer、StringBuilder的区别jvm堆和栈的区别垃圾回收标记阶段清除阶段 异常类型双亲委派机制hashmap和hashtable concurrentHashMap 1.7和1.8的区别java的数据结构排序算法,查找算法堆排序 ThreadLocal单例模式常量池synchronizedsynch…...

网络安全--安全认证、IPSEC技术

目录 1. 什么是数据认证,有什么作用,有哪些实现的技术手段? 2. 什么是身份认证,有什么作用,有哪些实现的技术手段? 3. 什么是VPN技术? 4. VPN技术有哪些分类? 5. IPSEC技术能够…...

Mysql——创建数据库,对表的创建及字段定义、数据录入、字段增加及删除、重命名表。

一.创建数据库 create database db_classics default charsetutf8mb4;//创建数据库 use db_classics;//使用该数据库二.对表的创建及字段定义 create table if not exists t_hero ( id int primary key auto_increment, Name varchar(100) not null unique, Nickname varchar(1…...

第1篇 目标检测概述 —(4)目标检测评价指标

前言:Hello大家好,我是小哥谈。目标检测评价指标是用来衡量目标检测算法性能的指标,可以分为两类,包括框级别评价指标和像素级别评价指标。本节课就给大家重点介绍下目标检测中的相关评价指标及其含义,希望大家学习之后…...

前端和后端是Web开发中的两个不同的领域,你更倾向于哪一种?

前端和后端是Web开发中的两个不同的领域,你更倾向于哪一种? 你可以从以下几个维度谈谈你对前端开发和后端开发的看法。此为内容创作模板,在发布之前请将不必要的内容删除 一、引言 提示:可对前端开发和后端开发进行简要介绍并提出…...

SpringBoot集成MyBatis-Plus实现增删改查

背景 因为学习工具的时候经常需要用到jar包,需要增删查改接口,所以参考文章实现了基于mybatis-plus的增删查改接口。 参考文章:第二十二节:SpringBoot集成MyBatis-Plus实现增删改查 原文中的git地址不存在,本文内容是原文代码修…...

基于STM32设计的智能水产养殖系统(华为云IOT)

一、设计简述 基于STM32设计的智能水产养殖监测系统 1.1 项目背景 随着经济的发展和人口的增长,对水产养殖的需求不断增加。然而,传统的水产养殖方式存在一系列问题,如水质污染、鱼病爆发等。因此,智能化水产养殖技术成为当前热门研究领域。其中,基于物联网技术的智能水产…...

运行软件找不到mfc140u.dll怎么解决,mfc140u.dll是什么文件

"找不到 mfc140u.dll"是一条错误信息,表示您的计算机上缺少一个名为 mfc140u.dll 的动态链接库(DLL)文件。这个文件通常与 Microsoft Visual C Redistributable 相关。Mfc140u.dll 是 Microsoft 基础类库(MFC&#xff0…...

数据结构(2-5~2-8)

2-5编写算法&#xff0c;在单链表中查找第一值为x的结点&#xff0c;并输出其前驱和后继的存储位置 #include<stdio.h> #include<stdlib.h>typedef int DataType; struct Node {DataType data; struct Node* next; }; typedef struct Node *PNode; …...

浅谈智能安全配电装置在老年人建筑中的应用

摘要&#xff1a;我国每年因触电伤亡人数非常多&#xff0c;大多数事故是发生在用电设备和配电装置。在电气事故中&#xff0c;无法预料和不可抗拒的事故是比较少的&#xff0c;大量用电事故可采取切实可行措施来预防。本文通过结合老年人建筑的特点和智能安全配电装置的功能&a…...

【ES】笔记-ES6模块化

暴露数据引入模块语法 规范基本语法分别暴露 (按需暴露)统一暴露 export {暴露内容1&#xff0c;暴露内容2}默认暴露 (适合只暴露一个数据) 只能暴露一次同时使用在app.js中引入 规范 每个文件都是一个模块要借助Babel和Browserify依次编译代码&#xff0c;才能在浏览器端运行…...

阿里云/腾讯云国际站代理:腾讯云国际站开户购买EdgeOne发布,安全加速一体化方案获业内认可

作为下一代CDN产品面世的腾讯云EdgeOne&#xff0c;历时一年服务&#xff0c;腾讯云国际站凭借安全加速一体化的解决方案&#xff0c;用All in One 架构构筑边缘应用无限想象。 近年来&#xff0c;随着5G网络、物联网、边缘计算的快速发展&#xff0c;爆炸式增长的数据量和市场…...

AIGC AI绘画 Midjourney 的详细使用手册

Midjourney参数提示与用法。 常见的命令有: --seed:种子值 --q:品质 --c:混乱 --no:负面提示 --iw:权重(0.5-2) ::(多重提示) -- repeat(重复) --stop(停止) --title(无缝贴图:适用于模型版本 1、2、3、5) --video(过程动画,适用于模型版本 1、2…...

Lua系列文章(1)---Lua5.4参考手册学习总结

windows系统上安装lua,下载地址&#xff1a; Github 下载地址&#xff1a;https://github.com/rjpcomputing/luaforwindows/releases 可以有一个叫SciTE的IDE环境执行lua程序 1 – 简介 Lua 是一种强大、高效、轻量级、可嵌入的脚本语言。 它支持过程编程&#xff0c; 面向对…...

Leetcode.121 买卖股票的最佳时机

题目链接 Leetcode.121 买卖股票的最佳时机 esay 题目描述 给定一个数组 p r i c e s prices prices &#xff0c;它的第 i i i 个元素 p r i c e s [ i ] prices[i] prices[i] 表示一支给定股票第 i i i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在…...

IDE相关设置和插件

https://www.jetbrains.com/zh-cn/webstorm/ 一、插件 Chinese ​(Simplified)​ Language Pack&#xff1a;中文语言包Translation&#xff1a;翻译插件&#xff0c;需要申请国内翻译软件应用&#xff0c;可以搜索translations配置快捷键any-rule&#xff1a;正侧插件&#…...

nodejs之jsdom插件,运行浏览器环境

https://www.npmjs.com/package/jsdom 一、安装依赖 npm install jsdom二、用法 var jsdom require(jsdom) var { JSDOM } jsdom; var dom new JSDOM(<!DOCTYPE html><html lang"cn"><head></head><body></body></htm…...

运行vite项目报错:await import(‘source-map-support‘).then((r) => r.default.install())

项目场景&#xff1a; Electron vue3 vite项目实现屏幕截图功能 问题描述 运行 npm run dev 启动项目报错 await import(source-map-support).then((r) > r.default.install()) PS D:\study\electron\electronDemo> npm run dev> electronDemo0.0.1 dev D:\study…...

【GIT版本控制】--安装GIT

一、在不同操作系统上安装GIT 在不同操作系统上安装GIT非常容易&#xff0c;以下是针对不同操作系统的安装步骤&#xff1a; 在Windows上安装GIT&#xff1a; 访问 Git官方网站。下载适合您Windows版本的GIT安装程序&#xff08;32位或64位&#xff09;。运行下载的安装程序。…...

java 常见api Arrays类

int类型数组 package daysreplace;import java.util.Arrays;public class Test {public static void main(String[] args) {int[] arrays{38,24,42,56,22,44};//直接输出数组名称就是内存地址System.out.println(arrays);//Arrays.toString()会将数组内容转成字符串形式System…...

Java常见设计模式

单例模式&#xff1a;程序自始至终只创建一个对象。 应用场景&#xff1a;1.整个程序运行中只允许一个类的实例时 2.需要频繁实例化然后销毁的对象 3.创建对象时耗时过多但又经常用到的对象 4.方便资源相互通信的环境 懒汉式线程不安全问题解决方案&#xff1a; 双重检查加锁机…...

Hive 【Hive(七)窗口函数练习】

窗口函数案例 数据准备 1&#xff09;建表语句 create table order_info (order_id string, --订单iduser_id string, -- 用户iduser_name string, -- 用户姓名order_date string, -- 下单日期order_amount int -- 订单金额 ); 2&#xff09;装载语句 i…...

C++深入学习part_1

Linux下编译C程序 安装g命令&#xff1a;sudo apt install g 编译命令&#xff1a;$ g *.cc 或者 *.cpp -o fileName; hellworld 编译程序可以看到&#xff1a; namespace命名空间 首先&#xff0c;命名空间的提出是为了防止变量重名冲突而设置的。 浅浅试一下&#xff1…...

leetCode 300.最长递增子序列 (贪心 + 二分 ) + 图解 + 优化 + 拓展

300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff…...

Spring加载后置处理器方式之模板方法

Spring加载后置处理器方式之模板方法 1. 未使用模板方法时2. 使用模板方法后 1. 未使用模板方法时 public static void main(String[] args) {MyBeanFactory myBeanFactory new MyBeanFactory();myBeanFactory.getBean();}static class MyBeanFactory {public Object getBean(…...

【高性能计算】CUDA编程之OpenCV的应用(教程与代码-4)//test error

imread命令将返回以蓝色、绿色和红色&#xff08;BGR格式&#xff09;开头的三个通道 处理视频的main函数中需要做的第一件事是创建VideoCapture对象。 GPU CUDA模块中的函数都定义在cv::cuda命名空间中&#xff0c;将设备上配置给图像数据用的显存块作为其参数。 gettickcount…...

高德地图行政区域四级级联数据拉取;省市区县乡镇级联数据

高德地图行政区域四级级联数据拉取 高德地图行政区域级联选择 高德地图行政区域级联选择 使用以下代码拉取高德官方省市区县乡镇四级级联数据 function p(name/* 行政区域名称 */){return $.ajax({"url": "https://lbs.amap.com/_AMapService/v3/config/dis…...

Qt_基础

目录 1概述1.1 什么是QT1.2 QT的发展史1.3 支持的平台1.4 QT版本1.5 下载与安装1.6 QT的优点1.7 成功案例 2 创建 Qt 项目2.1 使用向导创建2.2 .pro文件2.3 帮助文档(QTcreator自带的)2.4 QT应用程序介绍 3 创建第一个小程序3.1 按钮的创建3.1.1 设置主窗口标题的函数3.1.2 **固…...

最新AI创作系统源码ChatGPT网站源码V2.6.3/支持Midjourney绘画/支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Chat…...

商务网页/亚马逊seo什么意思

1. wget命令CentOS中 wget是一个从网络上自动下载文件的命令&#xff0c;它支持HTTP、HTTPS和FTP协议&#xff0c;wget可以在用户退出系统之后在后台执行。wget可以从网络上下载各种文件&#xff0c;甚至可以用来下载可用的仓库源文件&#xff0c;比如&#xff1a;# 用于下载or…...

电商平台网站制作费用/百度排名怎么做

1案例一 下图显示一个递归函数 假设内存有一块空间&#xff0c;这个程序可以用 &#xff0c;N传进来部为0&#xff0c;它递归调用PrintN&#xff0c;传进去99999 ,调用这个函数前要把printN&#xff08;100000&#xff09;状态存进内存&#xff0c;执行完在恢复。最后存在系统…...

小白怎么建设网站/百度网站域名

第一步&#xff1a;插件下载 http://spring.io/tools/sts/all 安装包链接 第二步&#xff1a;插件安装 第三步&#xff1a;安装成功检测 转载&#xff1a;http://www.cnblogs.com/damowang/p/6225076.html...

天津市建筑信息网/太原百度快速优化排名

正题第四题&#xff1a;[NOI2002]银河英雄传说这道题看上去很简单&#xff0c;做起来却对ij之间飞船的数量给搞混了。那么我们很容易就可以知道&#xff0c;要求ij之间的飞船个数&#xff0c;只要我们知道j前面有多少飞船&#xff0c;i前面有多少飞船即可&#xff0c;直接用abs…...

怎么建设国外免费网站/网络推广销售是做什么的

使用离散余弦变换的图像压缩此示例说明如何使用离散余弦变换 (DCT) 压缩图像。该示例计算输入图像中 88 个数据块的二维 DCT&#xff0c;丢弃(设置为零)每个数据块中 64 个 DCT 系数中除 10 个以外的所有系数&#xff0c;然后使用每个数据块的二维逆 DCT 重构图像。该示例使用变…...

郴州网站建设专业定制/精美软文句子

精确表达浮点数 问题描述 在计算机中&#xff0c;使用float或者double来存储小数是不能得到精确值的。如果你希望得到精确计算结果&#xff0c;最好是用分数形式来表示小数。有限小数或者无限循环小数都可以转化为分数。比如&#xff1a; 0.9 9/10 0.333&#xff08;3&#xf…...