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

【数据库设计和SQL基础语法】--用户权限管理--数据备份和恢复策略

一、引言

数据备份和恢复是数据库管理中至关重要的任务,对于确保数据安全性和业务连续性具有重大的意义。以下是一些关键的重要性方面:

  1. 防止数据丢失: 数据备份是防止因硬件故障、人为错误、恶意攻击或其他意外事件导致数据丢失的主要手段。通过定期备份数据,可以最小化潜在的信息损失。
  2. 应对灾难: 自然灾害、火灾、洪水、地震等不可预测的灾难可能导致数据中心的完全或部分破坏。备份数据可以用于快速恢复业务,并降低因灾难性事件造成的影响。
  3. 应对人为错误: 人为错误是数据丢失的常见原因之一。这可能包括误删除、更新错误或不慎执行的SQL语句。备份允许在出现问题时迅速还原到之前的状态。
  4. 满足合规性要求: 许多行业和法规对于数据的长期存储和备份提出了具体要求。合规性要求可能涉及到备份的频率、数据的保存期限以及数据存储的安全性等方面。
  5. 保障业务连续性: 数据是现代业务运营的核心。数据库的持续可用性对于业务连续性至关重要。通过备份和恢复策略,可以更快地从故障中恢复,并减少因系统停机而导致的损失。
  6. 支持测试和开发: 在开发和测试环境中,备份数据可以用于创建与生产环境相似的测试环境。这有助于确保新的应用程序版本、更新或配置更改在生产环境中的运行良好。
  7. 保护数据完整性: 数据备份不仅仅是为了应对灾难,还有助于保护数据的完整性。在进行数据库维护、升级或迁移时,备份可用于回滚到安全状态。

二、数据库备份策略

2.1 定期完整备份
  1. 什么是完整备份
    完整备份是一种备份数据库中所有数据的操作。在完整备份过程中,数据库管理系统将数据库的整个内容复制到备份存储位置,包括所有表、索引、存储过程、触发器等数据库对象。完整备份是数据库备份中最基本、最全面的一种备份方式。

  2. 完整备份的执行频率
    完整备份的执行频率在很大程度上取决于多个因素,其中最关键的因素之一是业务需求。在确定完整备份的执行频率时,数据库管理员需要综合考虑数据的变化率、业务对数据恢复的要求、备份存储的可用性以及备份对系统性能的影响。
    首先,对于变化率较低的数据库,执行完整备份的频率可以相对较低。这是因为数据变化较少,相邻两次备份之间的差异有限,因此频繁执行完整备份可能是冗余的。反之,对于变化率高的数据库,更频繁的完整备份可能更为合适,以捕捉到更多的数据变化,减小备份之间的差异。
    其次,业务对数据恢复的要求也是决定完整备份频率的关键因素。如果业务对数据的及时性和准确性要求较高,那么可能需要更频繁的完整备份,以确保在发生故障时可以尽快恢复到最新的状态。相反,如果业务能够容忍一定程度的数据丢失,完整备份的频率可以相对较低。
    此外,备份存储的可用性也需要考虑。频繁执行完整备份可能导致大量的存储需求,因此需要确保有足够的备份存储空间。这可能涉及到硬件成本、云存储费用等方面的考虑。
    最后,数据库管理员还需要评估完整备份对系统性能的影响。备份通常会占用系统资源,可能导致数据库性能下降。因此,在选择完整备份的执行频率时,需要在备份和业务运行之间取得平衡,以最小化备份对正常业务操作的干扰。

2.2 差异备份
  1. 差异备份概述
    差异备份是一种备份策略,其核心思想是只备份自上次完整备份或差异备份以来发生更改的数据。与完整备份不同,差异备份仅记录数据库中自上次备份以来发生的变化,从而减少备份所需的存储空间和时间。

  2. 与完整备份的关系
    差异备份和完整备份是数据库备份策略中的两种不同类型,它们之间存在紧密的关系。理解它们之间的关系有助于有效制定备份策略和进行数据恢复。

    • 初始完整备份: 差异备份通常需要依赖于初始的完整备份。在备份周期开始时,首先执行一次完整备份,将整个数据库的内容保存到备份存储介质中。这个完整备份建立了差异备份的基础。
    • 差异备份的生成: 一旦完成初始完整备份,接下来的备份可以是差异备份。差异备份捕获了自上次完整备份或差异备份以来发生的所有变化。它记录了数据库中的新增、修改或删除的数据块,而不是整个数据库。这使得差异备份相比完整备份更为高效,减小了备份所需的存储空间和备份过程的时间。
    • 恢复过程: 在进行数据恢复时,首先需要还原最近的完整备份。然后,可以应用相应的差异备份,逐步将数据库恢复到最新的状态。由于差异备份只包含了变化的部分,相较于只使用完整备份,数据恢复的时间可以得到显著减少。
    • 备份链的管理: 完整备份和差异备份形成了备份链。备份链的长度由完整备份的频率和差异备份的数量共同决定。数据库管理员需要定期执行完整备份,以控制备份链的长度并避免潜在的备份文件过大的问题。

Tip:差异备份是建立在完整备份基础上的,通过记录自上次备份以来的变化,实现了更高效的备份和恢复过程。完整备份提供了备份链的初始点,而差异备份则为备份链的中间和后续部分提供了增量的内容。两者协同工作,形成了综合而强大的数据库备份策略。

2.3 事务日志备份
  1. 事务日志的作用
    事务日志(Transaction Log)在数据库管理中扮演着关键的角色,其作用涵盖了数据恢复、事务原子性、性能优化和数据库复制等多个方面。以下是事务日志的详细作用:

    • 数据恢复: 事务日志记录了数据库中每个事务的详细操作,包括对数据的修改。在发生数据库故障、硬件故障、意外关机或其他灾难性事件时,事务日志允许数据库管理系统回滚到事务发生之前的状态,从而实现数据的恢复。通过重放日志中的事务记录,数据库可以逐步还原到最后一次完整备份或差异备份的状态。
    • 事务原子性的保证: 事务日志对数据库的每个事务进行记录,确保了事务的原子性。在事务提交之前,相关的修改操作会被写入事务日志。如果事务未能成功完成,数据库系统可以通过回滚日志中的信息来撤销已经进行的修改,确保数据库的一致性。
    • 性能优化: 事务日志的使用可以提高数据库的性能。通过先将事务的修改操作记录到日志中,而不是直接写入数据库文件,可以减少磁盘I/O的次数,提高事务的执行速度。数据库系统可以异步地将日志中的修改操作应用到实际的数据库文件,从而提升事务的响应时间。
    • 数据库复制和高可用性: 事务日志对于数据库复制和高可用性架构非常重要。在数据库复制中,主数据库的事务日志可以被传送到一个或多个备份数据库,确保备份数据库与主数据库保持一致。在高可用性方案中,事务日志的同步传输和应用可以确保在主数据库发生故障时,备份数据库能够快速地接管工作,实现故障切换。
    • 回滚和恢复数据库: 事务日志允许数据库管理员执行回滚操作,将数据库恢复到之前的状态。这对于误操作、错误的数据更新或者灾难性事件的恢复非常有用。通过事务日志,可以迅速地回滚到某个时间点,而无需完整地还原整个数据库。
  2. 事务日志备份的频率
    事务日志备份的频率是一个重要的数据库管理决策,需综合考虑业务需求、数据重要性、恢复时间目标以及备份存储的可用性等多个因素。一般而言,事务日志备份的频率可以根据以下几个方面进行综合考虑。
    首先,业务需求对备份频率有直接的影响。如果业务对于数据恢复的要求较高,例如需要尽可能减小数据丢失的时间窗口,那么事务日志备份的频率可能需要相对较高。相反,如果业务能够容忍一定程度的数据丢失,备份频率可以适度减少。
    其次,考虑数据的重要性。对于关键业务数据,通常需要更频繁的事务日志备份,以确保对数据的及时保护和恢复。对于较为次要的数据,备份频率可以相对较低。
    第三,需要根据恢复时间目标来确定备份频率。如果业务对于数据恢复的时间有较紧迫的要求,可能需要更频繁的事务日志备份,以便在发生故障时可以更迅速地还原到最近的时间点。
    此外,备份存储的可用性也是备份频率的考虑因素。较高的备份频率可能导致较大的备份文件数量和更多的存储需求。数据库管理员需要确保备份存储系统能够支持所选备份频率,避免因存储空间不足或性能瓶颈而影响备份的有效性。
    最后,备份策略需要综合考虑完整备份、差异备份和事务日志备份的协同作用。不同类型的备份互相补充,共同构成了综合的数据保护方案。备份频率的设计应该考虑到这些备份类型的关系,以确保在发生故障时能够快速、可靠地恢复数据。

三、恢复策略

3.1 完整恢复
  1. 完整备份的恢复过程
    完整备份的恢复过程是数据库管理中关键的步骤,它涉及将整个数据库从备份中还原到先前的状态。以下是完整备份的恢复过程的一般步骤:
    • 准备备份: 在开始恢复过程之前,需要确保有最新的完整备份可供使用。这通常涉及到备份文件的定期创建和存储。如果数据库采用了定期完整备份的策略,可以选择最近的一次完整备份作为恢复的起点。
    • 关闭数据库: 在执行完整备份的恢复之前,通常需要关闭数据库以防止正在进行的事务和操作对恢复过程产生干扰。这可以通过停止数据库管理系统服务或将数据库设置为单用户模式来实现。
    • 备份当前数据库状态(可选): 在关闭数据库之前,可以选择备份当前数据库状态。这可以是一个额外的步骤,用于记录在进行完整备份恢复之前数据库中的任何变化。这样的备份可以在需要时用于比较和审计。
    • 将完整备份文件还原到数据库服务器: 使用数据库管理工具或相应的还原命令,将选定的完整备份文件还原到数据库服务器。这个过程将数据库文件和事务日志文件还原到备份时的状态。
    • 启动数据库: 完整备份成功还原后,启动数据库服务。这使得数据库处于可用状态,并允许用户和应用程序访问。
    • 应用事务日志: 如果存在事务日志备份,通常还需要将最近的事务日志备份应用到数据库中,以捕捉在完整备份和恢复期间发生的任何更改。这确保数据库处于最新的可用状态。
    • 开放数据库: 恢复完成后,数据库可以对用户和应用程序进行开放,允许正常的读写操作。

Tip:完整备份的恢复过程涉及选择适当的备份文件、关闭数据库、还原备份文件、启动数据库,并可能包括应用事务日志的步骤。这个过程是关键的,确保数据库在发生故障或数据丢失时能够迅速有效地恢复到可用状态。

3.2 差异恢复
  1. 差异备份的恢复流程
    差异备份的恢复流程是数据库管理中的关键步骤,涉及将数据库从完整备份或上一个差异备份的状态还原到最新的差异备份所记录的时间点。以下是差异备份的一般恢复流程:
    • 准备备份: 在开始恢复过程之前,确保有最新的完整备份可供使用。此外,需要保证存在差异备份文件,这是上一个完整备份之后经过修改的部分。
    • 关闭数据库: 在执行差异备份的恢复之前,通常需要关闭数据库以防止正在进行的事务和操作对恢复过程产生干扰。这可以通过停止数据库管理系统服务或将数据库设置为单用户模式来实现。
    • 备份当前数据库状态(可选): 在关闭数据库之前,可以选择备份当前数据库状态,用于记录在进行恢复之前数据库中的任何变化。这样的备份可以在需要时用于比较和审计。
    • 将最近的完整备份还原到数据库服务器: 使用数据库管理工具或相应的还原命令,将最近的完整备份文件还原到数据库服务器。这将把数据库还原到完整备份时的状态。
    • 将最新的差异备份还原到数据库服务器: 接下来,使用数据库管理工具或还原命令,将最新的差异备份文件还原到数据库服务器。这将应用在上一个备份(完整备份或上一个差异备份)之后发生的所有更改。
    • 启动数据库: 完整备份和最新的差异备份成功还原后,启动数据库服务。这使得数据库处于可用状态,并允许用户和应用程序访问。
    • 应用事务日志(可选): 如果存在事务日志备份,通常还需要将最近的事务日志备份应用到数据库中,以捕捉在最新差异备份和恢复期间发生的任何更改。
    • 开放数据库: 恢复完成后,数据库可以对用户和应用程序进行开放,允许正常的读写操作。

Tip:差异备份的恢复流程与完整备份的恢复类似,不同之处在于差异备份需要首先应用最近的完整备份,然后再应用最新的差异备份。这个过程确保数据库在发生故障或数据丢失时能够迅速有效地恢复到最新状态。

3.3 逐步恢复
  1. 逐步恢复的步骤
    逐步恢复是一种数据库恢复策略,通常用于从事务日志备份逐步将数据库还原到某一特定时间点的状态。以下是逐步恢复的一般步骤:
    • 准备备份: 确保有最新的完整备份和一系列的事务日志备份可供使用。事务日志备份应该覆盖从完整备份开始到需要进行逐步恢复的时间点的所有操作。
    • 关闭数据库: 在进行逐步恢复之前,通常需要关闭数据库以防止正在进行的事务和操作对恢复过程产生干扰。这可以通过停止数据库管理系统服务或将数据库设置为单用户模式来实现。
    • 备份当前数据库状态(可选): 在关闭数据库之前,可以选择备份当前数据库状态。这样的备份可以在需要时用于比较和审计。
    • 将最近的完整备份还原到数据库服务器: 使用数据库管理工具或相应的还原命令,将最近的完整备份文件还原到数据库服务器。这将把数据库还原到完整备份时的状态。
    • 逐步应用事务日志备份: 从完整备份之后的第一个事务日志备份开始,逐一将每个事务日志备份应用到数据库中。这是通过数据库管理工具或相应的还原命令完成的。每个事务日志备份包含了在上一个备份(完整备份或上一个事务日志备份)之后发生的所有更改。
    • 选择目标时间点: 在逐步应用事务日志备份的过程中,需要选择一个目标时间点,即恢复到某一特定的时间。这可以是数据库中的任何事务发生的时间点。
    • 继续应用事务日志备份: 一直应用事务日志备份,直到达到或接近选择的目标时间点。确保事务日志备份的应用是按照时间顺序的,以保持数据的一致性。
    • 启动数据库: 完整备份和所有相关的事务日志备份成功还原后,启动数据库服务。这使得数据库处于可用状态,并允许用户和应用程序访问。
    • 开放数据库: 恢复完成后,数据库可以对用户和应用程序进行开放,允许正常的读写操作。

Tip:逐步恢复的过程涉及选择一个目标时间点,从最近的完整备份开始逐步应用事务日志备份,直到达到或接近目标时间点。这确保了数据库可以逐步还原到所需的状态。

四、自动化备份和监控

4.1 调度和自动执行备份任务
  1. 使用数据库管理工具
    数据库管理工具通常提供了调度和自动执行备份任务的功能,这使得数据库管理员能够方便地设置定期备份,降低人工操作的负担,并确保数据定期得到有效的保护。以下是使用数据库管理工具进行调度和自动执行备份任务的一般步骤:
    • 登录到数据库管理工具: 打开数据库管理工具并使用管理员身份登录到数据库服务器。不同的数据库管理工具有不同的界面和登录方式,但通常需要提供合适的用户名和密码。
    • 选择备份选项: 在数据库管理工具中,找到备份相关的选项或功能。这通常在管理工具的主界面或备份与还原菜单中可以找到。
    • 配置备份任务: 进入备份选项后,配置备份任务的相关参数。这可能包括选择备份类型(完整备份、差异备份、事务日志备份等)、备份目标路径、备份文件的命名规则、备份的频率和执行时间等。根据实际需求,可能还需要设置一些其他的备份选项,如压缩、加密、备份过期策略等。
    • 选择调度选项: 大多数数据库管理工具提供了调度备份任务的选项。在备份任务配置中,找到调度或计划相关的设置。这通常包括选择备份的执行频率(每天、每周、每月等)和具体的执行时间。
    • 保存设置: 在配置好备份任务和调度选项后,确保保存设置。不同的数据库管理工具有不同的保存方式,可能是通过“应用”、“保存”或类似的按钮。
    • 手动执行测试(可选): 在设置好备份任务后,通常可以手动执行一次测试备份,以确保备份任务的配置是正确的。这有助于及时发现潜在的问题。
    • 启用调度: 如果备份任务需要定期执行,确保启用了调度选项。这通常涉及到在调度设置中选择“启用”或类似的选项。
    • 监控和日志: 大多数数据库管理工具提供备份任务的监控和日志功能。确保开启备份任务的监控,以便及时发现和解决任何执行中的问题,并查看备份任务的日志记录以获取详细的执行信息。

通过以上步骤,数据库管理员可以使用数据库管理工具轻松地配置、调度和自动执行备份任务,确保数据库定期得到有效的备份和保护。

  1. 使用任务调度系统
    使用任务调度系统是一种更为灵活和综合的方法,可以对数据库备份任务进行更高级别的调度和管理。任务调度系统允许管理员设置复杂的调度策略,包括并行执行多个任务、依赖关系、错误处理和通知等功能。以下是使用任务调度系统进行数据库备份任务的一般步骤:
    • 选择任务调度系统: 选择适用于你的环境的任务调度系统。一些流行的任务调度系统包括Apache Airflow、Jenkins、cron等。这取决于你的需求和技术栈。
    • 安装和配置任务调度系统: 根据你选择的任务调度系统,安装和配置系统。这可能涉及到在服务器上设置调度系统的服务或在云服务上使用相应的调度服务。
    • 创建数据库备份任务: 在任务调度系统中创建一个新的任务,用于执行数据库备份。这可能包括指定备份类型、备份目标路径、备份文件的命名规则、备份的频率和执行时间等。
    • 设置调度规则: 配置调度规则,确定备份任务的执行频率。这可以是每天、每周、每月等,具体取决于你的备份策略。
    • 设置依赖关系: 如果有多个任务需要协同工作,设置任务之间的依赖关系。例如,确保在执行数据库备份任务之前,相关的服务已经启动或某个前置任务已经完成。
    • 设置错误处理和通知: 配置任务调度系统的错误处理机制,以便在备份任务执行失败时能够及时发现问题。同时,设置通知机制,例如通过电子邮件或消息通知,以便通知管理员有关任务执行结果的信息。
    • 监控和日志: 使用任务调度系统提供的监控和日志功能来跟踪备份任务的执行情况。这有助于及时发现潜在的问题,并提供详细的执行信息。
    • 测试备份任务: 在实际生产环境之前,通过任务调度系统手动执行一次备份任务进行测试,以确保任务的配置和执行都符合预期。

通过使用任务调度系统,数据库管理员可以实现更灵活、可控和可扩展的数据库备份策略。任务调度系统的强大功能能够满足不同场景下的复杂调度需求,提高备份任务的可靠性和可管理性。

4.2 备份监控
  1. 监控备份的健康状态
    监控备份的健康状态是数据库管理中的重要任务,以确保备份任务按预期执行,并在发生问题时能够及时采取措施。以下是监控备份健康状态的一些建议:
    • 监控备份执行状态: 定期检查备份任务的执行状态。确保备份任务按照预定的计划执行,没有异常中断或错误。
    • 验证备份文件完整性: 检查备份文件的完整性,确保它们没有损坏或被篡改。可以使用相关工具或数据库管理系统提供的命令来验证备份文件。
    • 检查备份文件大小和数量: 监控备份文件的大小和数量。异常的文件大小或数量可能表明备份过程中发生了问题,或者备份策略需要调整。
    • 记录备份执行时间: 记录备份任务的执行时间。比较实际执行时间和计划执行时间,确保备份任务在给定时间窗口内完成。
    • 检查日志文件: 定期检查备份任务的日志文件,查看是否有任何警告或错误信息。这有助于及时发现备份任务中的问题并进行修复。
    • 监控备份存储空间: 确保备份存储空间足够,能够容纳所有备份文件。监控存储空间的使用情况,预测未来的存储需求。
    • 设置警报和通知: 配置警报机制,以便在备份任务出现问题时能够及时通知管理员。这可以通过电子邮件、短信或集成到监控系统中实现。
    • 定期测试恢复过程: 定期测试备份的可用性,包括还原到测试环境并验证数据的一致性。这有助于确保备份文件不仅存在而且可用于数据恢复。
    • 监控备份链的完整性: 对于使用差异备份或事务日志备份的备份链,确保链中的所有备份文件都可用,并且可以正确地应用到数据库中。
    • 分析备份历史: 定期分析备份历史记录,了解备份任务的趋势和性能。这有助于优化备份策略,确保备份任务的效率和可靠性。

通过综合考虑以上因素,数据库管理员可以有效地监控备份的健康状态,及时发现并解决潜在的问题,从而确保数据库的数据得到有效的保护。

五、最佳实践和注意事项

‘在数据库备份和恢复的过程中,有一些最佳实践和注意事项,帮助确保数据的可靠性、完整性和安全性。以下是一些关键的最佳实践和注意事项:

5.1 最佳实践:
  1. 定期备份: 设定合适的备份频率,确保数据库定期备份。这可能包括完整备份、差异备份和事务日志备份,具体取决于业务需求。
  2. 多地备份: 将备份文件存储在不同的地理位置,以防发生灾难性事件。云存储、离线存储和远程数据中心都是备份存储的好选择。
  3. 测试恢复过程: 定期测试备份的可用性,包括还原到测试环境并验证数据的一致性。确保备份文件不仅存在而且可用于数据恢复。
  4. 监控备份任务: 设置警报和监控,以便在备份任务发生问题时及时获得通知。检查备份的执行状态、文件大小和数量,以确保备份任务按预期执行。
  5. 保护备份存储: 对备份存储实施访问控制和加密,以确保备份数据的安全性。定期审查备份存储的访问权限。
  6. 记录备份策略: 记录备份策略和执行历史。文档化备份过程和相关的恢复步骤,以便新成员或紧急情况下的使用。
  7. 深度学习和培训: 确保数据库管理员和相关团队具备足够的备份和恢复知识。进行培训,使他们了解最佳实践和紧急情况下的操作步骤。
  8. 版本控制: 将备份脚本、配置文件等纳入版本控制系统。这有助于追踪备份策略的变化,并在需要时进行回滚。
5.2 注意事项:
  1. 备份文件的安全性: 确保备份文件的安全性,防止未经授权的访问。加密备份文件,尤其是在离线存储或在外部传输时。
  2. 避免备份过程中的性能问题: 在备份时,避免对生产环境造成过大的性能负担。选择合适的备份窗口,避免与关键业务操作同时进行。
  3. 备份链管理: 定期清理不再需要的备份,以避免备份链过长导致存储问题。同时,确保备份链的完整性,避免损坏或丢失关键备份文件。
  4. 合理配置备份存储: 确保备份存储有足够的空间,并根据需求进行扩展。避免将备份存储与生产数据存储混合使用。
  5. 定期审查备份策略: 定期审查备份策略,确保其仍然符合业务需求。根据业务变化和数据库结构的变化,调整备份策略。
  6. 文档化紧急恢复流程: 文档化数据库紧急恢复的流程,包括在灾难发生时的步骤和联系人。确保相关人员了解并能够按照流程操作。

六、结论

数据库备份和恢复是确保数据库安全性和可用性的关键方面。最佳实践包括定期备份、多地备份、测试恢复过程、监控任务状态、保护备份存储和版本控制。注意事项涵盖备份文件的安全性、性能问题、备份链管理、备份存储配置、定期审查备份策略以及文档化紧急恢复流程。使用数据库管理工具和任务调度系统有助于自动化备份任务,提高操作效率。细致的监控备份的健康状态是预防和应对问题的关键,包括验证备份文件完整性、记录执行时间、设置警报和定期测试。通过综合遵循这些实践和注意事项,组织能够建立可靠的数据库备份和恢复策略,确保数据的持久性和业务的连续性。

相关文章:

【数据库设计和SQL基础语法】--用户权限管理--数据备份和恢复策略

一、引言 数据备份和恢复是数据库管理中至关重要的任务,对于确保数据安全性和业务连续性具有重大的意义。以下是一些关键的重要性方面: 防止数据丢失: 数据备份是防止因硬件故障、人为错误、恶意攻击或其他意外事件导致数据丢失的主要手段。…...

java数据结构与算法刷题-----LeetCode70. 爬楼梯

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只…...

【Unity入门】UGUI之Slider(滑动条)

目录 一、什么是Slider?二、Slider属性与功能 一、什么是Slider? Slider控件允许用户可以通过鼠标来在预先确定的范围调节数值 我们可以在Hierarchy视图右键 -> UI ->Slider来创建滑动条 通过上图可以发现Unity内置的Slider主要有3部分&#x…...

MySQL中UNION和UNION ALL的区别有哪些?

在MySQL中如何想要对两个结果集进行合并操作,可以使用UNION和UNION ALL,如果只是想要去除掉重复的记录,属于UNION ALL 即可,但是如何想要除掉没有重复行数据,就要使用Union。本文详细向大家介绍MySQL中UNION和UNION AL…...

Android kotlin build.gradle.kts配置

1. 添加 maven 仓库 1. 1. settings配置 1. 1.1. settings.gradle repositories {maven {url https://maven.aliyun.com/repository/public/}mavenCentral() }1. 1.2. settings.gradle.kts repositories {maven {setUrl("https://maven.aliyun.com/repository/public/…...

css、js、vue常考部分面试题

css css盒子水平垂直居中方法 方法一:定位 .child{height: 100px;position: absolute;//父元素相对定位top:50%;left:50%;transform: translate(-50%,-50%); } 方法二:定位 .child{width: 100px;height: 100px;position: absolute;top:50%;left:50%…...

OpenAI ChatGPT-4开发笔记2024-03:Chat之Function Calling/Function/Tool/Tool_Choice

Updates on Function Calling were a major highlight at OpenAI DevDay. In another world,原来的function call都不再正常工作了,必须全部重写。 function和function call全部由tool和tool_choice取代。2023年11月之前关于function call的代码都准备翘翘。 干嘛…...

二叉搜索树与双向链表

解题思路一: /** public class TreeNode {int val 0;TreeNode left null;TreeNode right null;public TreeNode(int val) {this.val val;} } */ // 一定要用自己的理解真正弄出来才行,否则没有用! // 再次提醒,计算机这种工科…...

uniapp中组件库的Checkbox 复选框 的丰富使用方法

目录 #平台差异说明 #基本使用 #自定义形状 #禁用checkbox #自定义形状 #自定义颜色 #横向排列形式 #横向两端排列形式 API #Checkbox Props #CheckboxGroup Props #CheckboxGroup Event 复选框组件一般用于需要多个选择的场景,该组件功能完整&#xff…...

Spring Cloud + Vue前后端分离-第10章 基于阿里云OSS的文件上传

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第10章 基于阿里云OSS的文件上传 前面介绍的文件上传是基于本地文件服务器的文件上传,但是自己搭文件服务器会有很多运维的问题,比如磁盘满了要扩容…...

C++ 中的耗时计算函数

#include <time.h>int clock_gettime (clockid_t clock_id, struct timespec *tp) 获取当前 clock_id 的时钟值并存储在 tp 中。 其中 tp 是一个 timespec 结构体&#xff0c;在 time.h 头文件中定义&#xff1a; #include <time.h>:struct timespec {time_t t…...

【Element】el-form和el-table嵌套实现表格编辑并提交表单校验

一、背景 页面需要用到表格采集用户数据&#xff0c;提交时进行表单校验&#xff1b;即表格中嵌套着表单&#xff0c;保存时进行表单校验 二、功能实现 2.1、el-form和el-table嵌套说明 ① :model"formData" 给表单绑定数据&#xff0c;formData是表单的数据对象 …...

初识Winform

什么是winform&#xff1f; WinForms&#xff08;Windows Forms&#xff09;是Microsoft .NET框架中的一个用户界面&#xff08;UI&#xff09;技术&#xff0c;用于创建Windows应用程序。它提供了一组用于构建图形用户界面的类和控件&#xff0c;以及与用户交互的事件模型。 …...

Redis:原理速成+项目实战——Redis实战5(互斥锁、逻辑过期解决缓存击穿问题)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战4&#xff08;解决Redis缓存穿透、雪崩、击穿&#xff09; &#x1f4da;订阅专…...

前端优化之一:dns预获取 dns-prefetch 提升页面载入速度

问题&#xff1a;怎么做到dns域解析&#xff1f; 用于优化网站页面的图片 问题&#xff1a;怎么提升网站性能&#xff1f; dns域解析&#xff0c;是提升网站的一个办法。 DNS Prefetch&#xff0c;即DNS预获取&#xff0c;是前端优化的一部分。 一般来说&#xff0c;在前端…...

C语言中一些基本数据类型的典型大小

char&#xff1a;通常是1字节。表示一个字符。int&#xff1a;通常在现代系统中是4字节&#xff08;但这取决于编译器和架构&#xff0c;有时可能是2字节&#xff09;。float&#xff1a;通常是4字节。double&#xff1a;通常是8字节。short 和 short int&#xff1a;通常是2字…...

[C/C++]排序算法 快速排序 (递归与非递归)

目录 &#x1f6a9;概念: &#x1f6a9;实现: ⚡1.hoare ⚡2.挖坑法 ⚡3.双指针法 &#x1f6a9;快速排序递归实现 &#x1f6a9;快速排序非递归实现 &#x1f6a9;概念: 通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据比另一部分的所有…...

『年度总结』逐梦编程之始:我的2023学习回顾与展望

目录 前言 我与Python 我与C语言 第一篇正式博客&#xff1a; 第二篇正式博客&#xff08;扫雷&#xff09;&#xff1a; 指针学习笔记: C语言学习笔记&#xff1a; 我与数据结构&#xff1a; yuan 这篇博客&#xff0c;我将回顾2023年编程之旅的起点&#xff0c;同时展…...

MyBatis学习二:Mapper代理开发、配置文件完成增删改查、注解开发

前言 公司要求没办法&#xff0c;前端也要了解一下后端知识&#xff0c;这里记录一下自己的学习 学习教程&#xff1a;黑马mybatis教程全套视频教程&#xff0c;2天Mybatis框架从入门到精通 文档&#xff1a; https://mybatis.net.cn/index.html Mapper代理开发 目的 解决…...

【React系列】受控非受控组件

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. refs 的使用 在React的开发模式中&#xff0c;通常情况下不需要、也不建议直接操作DOM原生&#xff0c;但是某些…...

OpenCV-Python(22):2D直方图

目标 了解图像的2D直方图绘制2D直方图 介绍 在前面的部分我们介绍了如何绘制一维直方图&#xff0c;之所以称为一维&#xff0c;是因为我们只考虑了图像的一个特征&#xff1a;灰度值。但是在2D 直方图中我们就需要考虑两个图像特征。对于彩色图像的直方图通常情况下我们需要…...

Kubernetes 100个常用命令

本文简单总结关于使用 Kubectl 进行 Kubernetes 诊断的指南。列出了 100 个 Kubectl 命令&#xff0c;这些命令对于诊断 Kubernetes 集群中的问题非常有用。这些问题包括但不限于&#xff1a; 集群信息 Pod 诊断 服务诊断 部署诊断 网络诊断 持久卷和持久卷声明诊断 资源…...

labuladong日常刷题-差分数组 | LeetCode 1109航班预定统计 | 花式遍历 151反转字符串里的单词

差分数组–前缀和数组的升级 LeetCode 1109 航班预定统计 2024.1.1 题目链接labuladong讲解[链接] class Solution { public:vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {//构建航班人数数组&#xff0c;数组大小为n,初…...

HbuilderX中的git的使用

原文链接https://blog.csdn.net/Aom_yt/article/details/119924356...

LeetCode每日一题 | 1944. 队列中可以看到的人数

文章目录 队列中可以看到的人数题目描述问题分析程序代码&#xff08;Golang 版本&#xff09; 队列中可以看到的人数 题目描述 原题链接 有 n 个人排成一个队列&#xff0c;从左到右 编号为 0 到 n - 1 。给你以一个整数数组 heights &#xff0c;每个整数 互不相同&#xff…...

React16源码: JSX2JS及React.createElement源码实现

JSX 到 Javascript 的转换 React中的 JSX 类似于 Vue中的template模板文件&#xff0c;Vue是基于编译时将template模板转换成render函数在React中&#xff0c;JSX是类似于html和javascript混编的语法&#xff0c;而javascript是真的javascript, html并非真的html它的可阅读性可…...

整理composer安装版本的python脚本

整理composer安装版本的python脚本 脚本实现的功能是去除composer安装命令后的版本号 def remove_version_numbers(commands):"""Remove version numbers from composer require commands.Args:commands (list of str): List of composer require commands.Retu…...

十、基本对话框大集合(Qt5 GUI系列)

目录 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 Qt提供了很多标准的对话框。例如标准文件对话框(QFileDialog)、标准颜色对话框(QColorDialog)、标准字体对话框 (QFontDialog)、标准输入对话框 (QInputDialog) 及消息对话框 (QMessageBox)。本文展示各…...

大A又跌了

才开盘几天&#xff0c;又开始下跌了。生活更加苦难。期待高深算法。...

This error originates from a subprocess, and is likely not a problem with pip

我遇这个问题是的原因是包名错误 注意检查包名...

建网站哪家好 优帮云/千万别在百度上搜别人的名字

figure&#xff1a;图表&#xff0c;可以理解为一个空间&#xff0c;二维情况下是一个平面 axes&#xff1a;坐标系&#xff0c;空间中的坐标系&#xff0c;一个空间可以有多个坐标系 axis&#xff1a;坐标轴&#xff0c;坐标系中的一个坐标轴&#xff0c;一个坐标轴只属于一个…...

做网站爱/品牌推广计划

在java中有许多的知识点&#xff0c;但是有些知识点显得非常重要&#xff0c;为什么这么说呢&#xff0c;这些知识点很简单、很基础&#xff0c;但是当别人问起来答不到时&#xff0c;就会被对方直接秒成菜鸟。 1、字符串不变性 Java里面对于字符串的处理方法有很多&#xff0c…...

建设银行网站会员注销/自媒体培训学校

2007年9月1日 来到了上海&#xff0c;开始了博客园新的发展征途&#xff01; 在这一年快乐的征途中&#xff0c;有太多收获&#xff0c;而有一个收获让其他收获黯然失色。 从一个人到一个团队&#xff0c;这一年征途最激动人心的收获&#xff01; 转载于:https://www.cnblogs.c…...

怎么给网站添加站点统计/b站推出的短视频app哪个好

113. 路径总和II 链接&#xff1a;https://leetcode-cn.com/problems/path-sum-ii/ 题目描述见链接内容。 解法1&#xff1a;广度优先搜索 在广度优先搜索时&#xff0c;重新构造了一个queue&#xff0c;原本的queue只用来存放未遍历的节点&#xff0c;现在queue的成员是一个…...

学习电商运营去哪里学/怎样淘宝seo排名优化

files found with path ‘assets/location_map_gps_locked.png’ from inputs: 解决方式&#xff1a; 在module的build.gradle中添加如下代码 android {packagingOptions {exclude assets/*} }...

网站子站怎么做的/公司做个网站多少钱

目录一、 基于对象的跨表查询1.1 一对多查询(Book与Publish)1.2 一对一查询(Author与AuthorDetail)1.3 多对多查询(Author与Book)1.3.1 练习前的准备1.3.2 开始查询1.3.3 特别注意二、基于双下划线的跨表查询2.1 练习一&#xff0c;一对多2.2 练习二&#xff0c;多对多2.3 练习…...