MySQL 数据库备份与还原

article/2025/7/6 21:51:34

作者:IvanCodes
日期:2025年5月18日
专栏:MySQL教程

思维导图

在这里插入图片描述

在这里插入图片描述

备份 (Backup) 与 冗余 (Redundancy) 的核心区别: 🎯

备份是指创建数据的副本并将其存储在不同位置或介质,主要目的是在发生数据丢失、损坏或逻辑错误时进行恢复到某一历史状态。冗余是指在系统中维护数据的多个实时或近实时副本(例如 RAID 磁盘阵列、数据库主从复制),主要目的是提高系统的可用性和容错性,当主副本故障时可以快速切换到备用副本。冗余通常不能防止逻辑错误(如误删除数据会同步到所有副本)或恢复到特定历史时间点。

mysqldump 逻辑备份详解: 📄➡️SQL
mysqldump 是 MySQL 官方提供的命令行工具,用于生成数据库的逻辑备份。它将数据库的结构定义(如 CREATE TABLE 语句)和数据内容(如 INSERT INTO 语句)导出为一系列 SQL 语句,通常保存为一个 .sql 文件。这种备份方式灵活,跨平台和版本兼容性好。

一、表级操作 📦

  • 表级备份 (备份指定表):
    备份特定数据库中的一个或多个表,包含其结构和数据。
    语法:
mysqldump -u [username] -p[password] [db_name] [table_name1] [table_name2] ... > tables_backup.sql

示例:备份 company_db 数据库中的 employeesdepartments 表。

mysqldump -u appuser -psecret company_db employees departments > company_db_emp_dept.sql
  • 表级还原 (还原指定表):
    将之前备份的表结构和数据导入到目标数据库中。通常目标数据库需要已存在。如果备份文件包含 CREATE TABLE 语句 (默认) 且目标库中已有同名表,可能需要先手动 DROP 目标表或备份文件中有 DROP TABLE IF EXISTS (mysqldump 默认添加)。
    语法:
mysql -u [username] -p[password] [db_name] < tables_backup.sql

示例:将 company_db_emp_dept.sql 中的表还原到 company_db 数据库。

mysql -u appuser -psecret company_db < company_db_emp_dept.sql

注意:此方法会将备份文件中的所有表导入指定数据库。若只想从多表备份文件中还原特定一个表,需手动编辑 SQL 文件提取该表相关语句,或使用 sed/awk 等工具处理。

二、库级操作 🗄️

  • 库级备份 (备份单个或多个数据库):
    备份一个或多个完整的数据库,包含其所有对象(表、视图、存储过程等)的结构和数据。
    备份单个数据库 (不含 CREATE DATABASE 语句):
mysqldump -u [username] -p[password] [db_name] > single_db_backup.sql

示例:备份 sales_db 数据库。

mysqldump -u data_analyst -psales_pass sales_db > sales_db_backup.sql

备份多个数据库 (使用 --databases 选项,备份文件会包含 CREATE DATABASE IF NOT EXISTS 语句):

mysqldump -u [username] -p[password] --databases [db_name1] [db_name2] ... > multiple_dbs_backup.sql

示例:备份 hr_dbfinance_db 数据库。

mysqldump -u admin_user -padmin_pass --databases hr_db finance_db > hr_finance_dbs_backup.sql
  • 库级还原 (还原单个或多个数据库):
    如果备份文件是使用 --databases 选项生成的,它通常包含创建数据库的语句,可以直接导入。如果备份的是单个数据库且不含 CREATE DATABASE 语句,则还原前目标数据库通常需要已存在(或手动创建)。
    还原单个数据库 (假设 single_db_backup.sql 不含 CREATE DATABASE):
-- 1. (如果数据库不存在) 在 mysql 客户端手动创建数据库:
-- CREATE DATABASE IF NOT EXISTS sales_db;
-- 2. 导入备份文件:
mysql -u [username] -p[password] [db_name] < single_db_backup.sql

示例:还原 sales_db_backup.sqlsales_db

mysql -u data_analyst -psales_pass sales_db < sales_db_backup.sql

还原多个数据库 (备份文件由 --databases 生成,包含 CREATE DATABASE):

mysql -u [username] -p[password] < multiple_dbs_backup.sql

示例:还原 hr_finance_dbs_backup.sql

mysql -u admin_user -padmin_pass < hr_finance_dbs_backup.sql

三、全库操作 🌍

  • 全库备份 (备份 MySQL 服务器上的所有数据库):
    使用 --all-databases (或 -A) 选项备份实例上的所有用户数据库。备份文件会包含所有数据库的 CREATE DATABASE IF NOT EXISTS 语句。通常建议同时备份存储过程、函数、触发器和事件。
    语法:
mysqldump -u [root_or_admin_user] -p[password] --all-databases --routines --triggers --events > full_instance_backup.sql

示例:以 root 用户备份所有数据库及相关对象。

mysqldump -u root -proot_password --all-databases --routines --triggers --events > mysql_server_full_backup.sql
  • 全库还原 (还原所有数据库):
    由于 --all-databases 生成的备份文件包含所有必要信息,可以直接导入到目标 MySQL 服务器 (通常是空实例或用于灾难恢复)。
    语法:
mysql -u [root_or_admin_user] -p[password] < full_instance_backup.sql

示例:还原 mysql_server_full_backup.sql

mysql -u root -proot_password < mysql_server_full_backup.sql

警告:全库还原是破坏性操作,会覆盖目标服务器上所有同名数据库。通常用于新环境搭建或灾难恢复。在生产环境执行前务必三思并确保有回退计划。

四、mysqldump 常用重要选项详解 🔧

  • --user=[username] -u [username]: 指定连接 MySQL 的用户名。
  • --password=[password] -p[password]: 指定密码。如果密码为空或包含特殊字符,建议使用 -p 然后按提示输入。
  • --host=[hostname] -h [hostname]: 指定连接的 MySQL 服务器主机名或 IP 地址 (默认为 localhost)。
  • --port=[port_num] -P [port_num]: 指定连接的 MySQL 服务器端口号 (默认为 3306)。
  • --single-transaction: 对于 InnoDB 表,在单个事务中进行备份,不阻塞写操作,实现热备份并保证数据一致性。对 MyISAM 表无效。
    示例:
mysqldump -u dbuser -pdbpass --single-transaction my_innodb_db > my_innodb_db_consistent.sql
  • --master-data=1 --master-data=2:
    • =1: 在备份文件中输出 CHANGE MASTER TO 语句,注释掉。用于设置从库。
    • =2: =1 类似,但 CHANGE MASTER TO 语句是注释掉的。更常用的是,它会在备份文件头部以注释形式记录当前二进制日志文件名和位置 (MASTER_LOG_FILE, MASTER_LOG_POS)。这对于基于二进制日志的时间点恢复 (PITR) 至关重要。
      示例:
mysqldump -u dbuser -pdbpass --single-transaction --master-data=2 my_db > my_db_with_binlog_info.sql
  • --flush-logs -F: 在开始备份前,关闭当前的二进制日志文件并创建一个新的。通常与 --master-data 配合使用,以确保全备之后的所有更改都记录在新 binlog 中。
  • --routines -R: 备份数据库中的存储过程和函数。
  • --triggers: 备份表上的触发器 (通常是默认行为,但显式指定更清晰)。
  • --events -E: 备份事件调度器中定义的事件。
  • --no-data -d: 只备份数据库结构(表定义、视图、存储过程等),不包含任何行数据。
    示例:
mysqldump -u dbuser -pdbpass --no-data my_db > my_db_structure_only.sql
  • --no-create-info -t: 只备份数据(INSERT 语句),不包含 CREATE TABLE 语句。通常与 --no-data 备份配合使用,或用于向已存在的表追加数据。
    示例:
mysqldump -u dbuser -pdbpass --no-create-info my_db my_table > my_table_data_only.sql
  • --databases: 明确指定一个或多个数据库进行备份,并在输出的 SQL 文件中包含 CREATE DATABASE IF NOT EXISTSUSE 语句。
  • --all-databases -A: 备份 MySQL 服务器上的所有数据库。
  • --add-drop-database: 在每个 CREATE DATABASE 语句前添加 DROP DATABASE IF EXISTS 语句。谨慎使用。
  • --add-drop-table: 在每个 CREATE TABLE 语句前添加 DROP TABLE IF EXISTS 语句 (默认行为)。
  • --skip-add-drop-table: 禁止在 CREATE TABLE 前添加 DROP TABLE IF EXISTS
  • --where='condition_string': 只导出表中满足指定 WHERE 条件的行。
    示例:只备份 orders 表中2023年的订单
mysqldump -u dbuser -pdbpass my_db orders --where="YEAR(order_date) = 2023" > orders_2023.sql
  • --ignore-table=db_name.table_name: 在备份数据库或所有数据库时,忽略指定的表。可以多次使用此选项来忽略多个表。
    示例:备份 my_db 但忽略 my_db.logs
mysqldump -u dbuser -pdbpass my_db --ignore-table=my_db.logs > my_db_no_logs.sql
  • --result-file=/path/to/output.sql -r /path/to/output.sql: 直接将输出写入指定文件,而不是标准输出。在 Windows 上可能比重定向 > 更可靠。
  • --default-character-set=charset_name: 指定备份时使用的字符集,如 utf8mb4
  • --set-gtid-purged=OFF|AUTO|ON: 控制备份文件中 GTID 信息的包含。对于基于 GTID 的复制环境非常重要。
  • --dump-slave --master-data: 已提及,对于复制和 PITR 至关重要。
  • --tz-utc: 备份时将会话时区设置为 UTC,并在备份文件中添加 SET TIME_ZONE='+00:00'。有助于在不同时区的服务器间迁移数据时保持时间戳一致性。

5. mysqldump + 二进制日志 (Binlog) 实现增量备份与时间点恢复 (PITR) 🔄
mysqldump 执行的是全量逻辑备份。为了实现真正的增量备份效果和精确的时间点恢复 (Point-in-Time Recovery, PITR),必须结合 MySQL 的二进制日志 (Binary Log)

基本策略与流程:

  1. 确保二进制日志已启用:
    在 MySQL 配置文件 (my.cnfmy.ini) 中检查或添加/修改以下参数:

    • log_bin = /path/to/your/binlog/mysql-bin (指定 binlog 文件名前缀和路径)
    • server_id = unique_server_id (每个 MySQL 服务器实例必须有唯一的 ID)
    • binlog_format = ROW (推荐,基于行的复制更准确,尤其是有不确定性函数时)
      修改配置后需重启 MySQL 服务。
  2. 执行定期全量备份并记录 Binlog 位置:
    例如,每天或每周执行一次全量备份。关键在于备份时记录下当时的二进制日志文件名位置 (position)GTID(如果使用 GTID 复制)。使用 mysqldump--master-data=2--flush-logs 选项可以方便地做到这一点。
    示例:每日全量备份脚本的一部分

BACKUP_DIR="/mnt/backups/mysql"
DATE_SUFFIX=$(date +%Y-%m-%d_%H-%M-%S)
FULL_BACKUP_FILE="${BACKUP_DIR}/full_backup_${DATE_SUFFIX}.sql.gz"
LOG_FILE="${BACKUP_DIR}/backup_log_${DATE_SUFFIX}.log"echo "Starting full backup at $(date)" >> ${LOG_FILE}
mysqldump -u root -pYourRootPassword --all-databases \--master-data=2 \--single-transaction \--flush-logs \--routines --triggers --events \--default-character-set=utf8mb4 \| gzip > ${FULL_BACKUP_FILE}if [ ${PIPESTATUS[0]} -eq 0 ]; thenecho "Full backup successful: ${FULL_BACKUP_FILE}" >> ${LOG_FILE}
elseecho "Full backup FAILED!" >> ${LOG_FILE}
fi
echo "Backup finished at $(date)" >> ${LOG_FILE}

备份完成后,查看 .sql.gz 解压后的文件头部,会有类似这样的注释:
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.0000XX', MASTER_LOG_POS=YYYY;
这里的 mysql-bin.0000XXYYYY 就是全备完成时的 binlog 文件和位置,是后续增量恢复的起点。

  1. 持续备份二进制日志文件:
    在两次全量备份之间,MySQL 会持续产生新的二进制日志文件。这些文件记录了自上次日志刷新(例如由 --flush-logs触发)以来的所有数据修改操作。你需要将这些物理的 binlog 文件定期从 MySQL 服务器的数据目录(或 log_bin 指定的路径)复制到安全的备份存储位置。这些是你的“增量”数据。
    可以通过 SHOW BINARY LOGS; 查看当前的 binlog 文件列表。通常,当一个 binlog 文件达到 max_binlog_size 或执行 FLUSH LOGS; 时,会生成新的 binlog 文件。

  2. 时间点恢复 (PITR) 流程: 🚑
    假设数据库在某个时间点 T_failure 发生故障,而你希望恢复到故障前的某个时间点 T_restore
    a. 确定恢复基准: 找到在 T_restore 之前的最近一次成功的全量备份文件,以及该备份对应的binlog 文件名 (start_log_file)位置 (start_log_pos)
    b. 准备恢复环境: 通常在一个新的或已清理的 MySQL 实例上进行恢复。
    c. 还原全量备份:
    bash gunzip < /mnt/backups/mysql/full_backup_YYYY-MM-DD_HH-MM-SS.sql.gz | mysql -u root -pYourRootPassword
    d. 找到并准备需要应用的 Binlog 文件: 收集中从 start_log_file 开始,一直到包含 T_restore 时间点的所有 binlog 文件。将这些文件按顺序放在一个可访问的目录。
    e. 应用 Binlog 进行增量恢复: 使用 mysqlbinlog 工具读取这些 binlog 文件,并将其中的 SQL 语句通过管道传递给 mysql 客户端执行。你需要精确控制应用的范围。
    示例:假设全备对应 mysql-bin.000005 位置 154,要恢复到 2023-10-27 10:30:00,期间的 binlog 文件是 mysql-bin.000005, mysql-bin.000006, mysql-bin.000007

     # 应用第一个相关的 binlog,从指定位置开始mysqlbinlog --start-position=154 /path/to/binlogs/mysql-bin.000005 | mysql -u root -pYourRootPassword# 应用中间完整的 binlog 文件mysqlbinlog /path/to/binlogs/mysql-bin.000006 | mysql -u root -pYourRootPassword# 应用最后一个相关的 binlog,直到指定停止时间点mysqlbinlog --stop-datetime="2023-10-27 10:30:00" /path/to/binlogs/mysql-bin.000007 | mysql -u root -pYourRootPassword```

mysqlbinlog 的其他重要选项:

  • --start-datetime="YYYY-MM-DD HH:MM:SS"
  • --stop-position=pos_num
  • --database=db_name (如果只想恢复特定数据库的更改)

如果使用 GTID,恢复过程会略有不同,通常依赖于 GTID 集合来确定恢复点。
通过这种“全量备份 + 增量二进制日志”的策略,可以实现非常灵活和精确的数据恢复。


练习题 ✍️

假设你有一个用户 backup_user 密码为 backup_pass,数据库 mydb 中有表 table1, table2, logs

  1. 编写命令备份 mydb 数据库中的 table1table2 到文件 mydb_tables.sql
    答案:
mysqldump -u backup_user -pbackup_pass mydb table1 table2 > mydb_tables.sql
  1. 编写命令备份整个 mydb 数据库 (包含结构和数据) 到 mydb_full.sql.gz (压缩格式)。
    答案:
mysqldump -u backup_user -pbackup_pass mydb | gzip > mydb_full.sql.gz
  1. 编写命令仅备份 mydb 数据库的结构 (不含数据) 到 mydb_structure.sql
    答案:
mysqldump -u backup_user -pbackup_pass --no-data mydb > mydb_structure.sql
  1. 编写命令备份所有数据库,包含存储过程和触发器,到 all_dbs_with_routines.sql,并记录二进制日志位置。
    答案:
mysqldump -u backup_user -pbackup_pass --all-databases --routines --triggers --master-data=2 > all_dbs_with_routines.sql
  1. 编写命令还原 mydb_full.sql.gz 备份文件到名为 mydb_restored 的新数据库 (假设 mydb_restored 已手动创建且为空)。
    答案:
gunzip < mydb_full.sql.gz | mysql -u backup_user -pbackup_pass mydb_restored
  1. 编写命令备份 mydb 数据库,但忽略 mydb.logs 表,输出到 mydb_no_logs.sql
    答案:
mysqldump -u backup_user -pbackup_pass mydb --ignore-table=mydb.logs > mydb_no_logs.sql
  1. 编写命令备份 mydb.table1status 列为 ‘active’ 的所有行到 active_rows_table1.sql
    答案:
mysqldump -u backup_user -pbackup_pass mydb table1 --where="status='active'" > active_rows_table1.sql
  1. 编写命令备份 mydb 数据库,使用单事务模式,并且在备份开始前刷新日志,输出到 mydb_flushed_single_trans.sql
    答案:
mysqldump -u backup_user -pbackup_pass --single-transaction --flush-logs mydb > mydb_flushed_single_trans.sql
  1. 假设 all_dbs_with_routines.sql 是通过 --all-databases 生成的。编写命令将其还原到 MySQL 服务器。
    答案:
mysql -u backup_user -pbackup_pass < all_dbs_with_routines.sql
  1. 编写命令备份 mydb 数据库,并指定使用 utf8mb4 字符集,输出到 mydb_utf8mb4.sql
    答案:
mysqldump -u backup_user -pbackup_pass --default-character-set=utf8mb4 mydb > mydb_utf8mb4.sql

http://www.hkcw.cn/article/InBRUvywfN.shtml

相关文章

MySQL Binlog 日志查看方法及查看内容解析

一、Binlog 日志概述 Binlog&#xff08;二进制日志&#xff09;记录了 MySQL 数据库执行的所有更改数据的操作&#xff0c;包括INSERT、UPDATE、DELETE等。它对于数据恢复、主从复制以及审计等方面有着至关重要的作用。 二、查看 Binlog 日志方法 开启 Binlog 日志功能 默…

【金仓数据库征文】金仓数据库(KingbaseES)迁移与集群部署实战:从MySQL到KES的全流程解析

随着企业信息化和数字化转型的加速&#xff0c;企业对数据库的要求不仅仅局限于基础的数据存储功能&#xff0c;更涉及到性能、可扩展性、安全性、以及持续的系统升级能力。因此&#xff0c;数据库迁移已经成为现代企业升级IT架构时的一个重要步骤。特别是在国产化替代的浪潮中…

【MySQL】 基本查询(下)

欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】 基本查询(下) 发布时间:2025.2.18 隶属专栏:MySQL 目录 Update语法案例Delete删除数据语法案例截断表语法案例插入查询结果语法案例聚合函数函数介绍案例group by子句的使用语法having和where案例结语Update 语法 UPDATE …

MySQL开大招了! 三十周年庆典推出四项 OCP 认证免费

&#x1f389; MySQL 30岁生日大礼包&#xff01;OU掏家底了&#xff01; 狠心决定&#xff1a;4.20-7.31期间 &#x1f525;全系列MySQL课程四大认证 &#x1f525;原价$2,500/人的考试资格 通&#xff01;通&#xff01;免&#xff01;费&#xff01; &#x1f4a1;30年只此一…

Kettle9.1链接mysql报错: Connection failed. Verify all connection parameters and confirm that the appropr

Connection failed. Verify all connection parameters and confirm that the appropriate driver is installed. The server time zone value ‘D1’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC 连接失败。验证所…

2025最新版|八股文面试题库+答案详解(附高频考点解析)

我相信大多 Java 开发的程序员或多或少经历过 BAT 一些大厂的面试&#xff0c;也清楚一线互联网大厂 Java 面试是有一定难度的&#xff0c;小编经历过多次面试&#xff0c;有满意的也有备受打击的。因此呢小编想把自己这么多次面试经历以及近期的面试真题来个汇总分析&#xff…

库室门禁报警系统|多功能控制器运用

库室门禁报警系统 库室门禁报警系统是一套综合性的安全防护体系&#xff0c;它集成了门禁控制、入侵报警、视频监控等多种功能。门禁控制功能通过对人员进出权限的精准管理&#xff0c;严格限制无关人员进入库室。系统可根据人员的身份、职务、工作需求等设定不同的权限&#…

【我给AI出题-1】DCMTK的storescu在发送医学图像给服务器时,能否指定客户端的端口号?

本文由Markdown语法编辑器编辑完成。 封面图像由: "即梦AI"创作&#xff0c;提示词: “几个AI工具&#xff0c;在一起激烈地讨论问题&#xff0c;包括: 豆包&#xff0c;kimi, deepseek, chatgpt, csdn的图标&#xff0c;作为人物形象. 可以生成吉普力的风格.” 1.…

研华工控机安装Windows10系统,适用UEFI(GPT)格式安装

主要硬件 主板&#xff1a;AIMB-787 、CPU&#xff1a;i5-6500 U盘启动工具&#xff1a;通过网盘分享的文件&#xff1a;rufus-3.20.zip 链接: https://pan.baidu.com/s/1YlFfd-_EhFHCG4sEHBQ8dQ?pwdQT12 提取码: QT12 Win10 22H2 Pro 纯净版系统&#xff1a;通过网盘分享…

ubuntu系统安装Pyside6报错解决

目录 1&#xff0c;问题&#xff1a; 2&#xff0c;解决方法&#xff1a; 2.1 首先查看pypi是否有你需要包的镜像&#xff1a; 2.2 其它方案&#xff1a; 2.3 如果下载很慢&#xff0c;可以换源&#xff1a; 2.4 查看系统架构 Windows Ubuntu 1&#xff0c;问题&#xf…

第六十一节:深度学习-使用 OpenCV DNN 模块

一、OpenCV DNN模块:传统与AI的桥梁 在深度学习席卷计算机视觉领域的今天,OpenCV作为最广泛使用的视觉库,通过其强大的DNN(Deep Neural Networks)模块架起了传统算法与深度学习之间的桥梁。该模块允许开发者在无需依赖原始深度学习框架的情况下,直接加载和运行预训练模型…

MySql(七)

目录 创建表 准备数据 1.更新表中的数据 1&#xff09;不带条件修改 修改eno表中的性别为女 查看表中的数据 修改表中的性别为女 2&#xff09;带条件修改 修改张三的性别为男 查看表 把地址为木星的修改为火星 一次修改多个列 删除数据 1&#xff09;语法&#xff08;删除表中…

算力租赁革命:弹性模式如何重构数字时代的创新门槛​

一、算力革命&#xff1a;第四次工业革命的核心驱动力​ 在科技飞速发展的当下&#xff0c;我们正悄然迎来第四次工业革命。华为创始人任正非在一场程序设计竞赛中曾深刻指出&#xff0c;这场革命的基础便是大算力。随着 5G、人工智能、大数据、物联网等信息技术的迅猛发展&am…

【sa-token】 sa-token非 web 上下文无法获取 HttpServletRequest。

Springboot cloud gateway集成sa-token中报错 cn.dev33.satoken.exception.NotWebContextException: 非 web 上下文无法获取 HttpServletRequestat cn.dev33.satoken.spring.SpringMVCUtil.getRequest(SpringMVCUtil.java:45) ~[sa-token-spring-boot-starter-1.38.0.jar:?]官…

动态规划-300.最长递增子序列-力扣(LeetCode)

一、题目解析 子数组vs子序列 回过头来&#xff0c;我们分析题目给出的条件&#xff0c;其中要注意的是严格递增这个字眼 二、算法原理 1、状态表示 我们想要知道的是最长递增子序列长度&#xff0c;所以dp[i]表示&#xff1a;以i位置元素为结尾的所有子序列中最长递增子序列…

MySQL中怎么看是否走了索引

学生表 创建普通索引 create index index_name on student (name); 1.使用EXPLAIN查看执行计划(核心) explain select * from student where name 李明 key字段&#xff1a;显示实际使用的索引名称。若值为NULL&#xff0c;表示未使用索引&#xff1b;若显示具体索引名&…

<< C程序设计语言第2版 >> 练习 1-23 删除C语言程序中所有的注释语句

1. 前言 本篇文章介绍的是实现删除C语言源文件中所有注释的功能.希望可以给C语言初学者一点参考.代码测试并不充分, 所以肯定还有bug, 有兴趣的同学可以改进. 原题目是: 练习1-23 编写一个删除C语言程序中所有的注释语句. 要正确处理带引号的字符串与字符常量. 在C语言中, 注释…

数据结构与算法之中缀表达式的求值

栈 栈的一个实际需求 请输入一个表达式计算式&#xff1a;[7*22-51-53-3]点击计算【如下图】 栈的介绍 栈的英文为stack(stack)。栈是一个先入后出(FILO-First In Last Out)的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表…

显卡3080和4060哪个强 两款游戏性能对比

对于硬核玩家而言&#xff0c;选择一款合适的显卡至关重要。在市场上&#xff0c;NVIDIA的3080和4060两款显卡备受关注。很多朋友在选择时会疑惑&#xff0c;究竟是3080更强&#xff0c;还是4060更具性价比呢&#xff1f;今天我们就来深入分析这两款显卡&#xff0c;帮助大家做…

Visual Studio 2022 发布独立的 exe 文件

我们在用 Visual Studio 2022 写好一个 exe 程序之后&#xff0c;如果想把这个拿到其他地方运行&#xff0c;需要把 exe 所在的文件夹一起拿过去。 编译出来的 exe 文件需要其他几个文件一同放在同一目录才能运行&#xff0c;原因在于默认情况下&#xff0c;Visual Studio 是把…