从MySQL迁移到PostgreSQL的完整指南

1.引言

在现代数据库管理中,选择合适的数据库系统对业务的成功至关重要。随着企业数据量的增长和对性能要求的提高,许多公司开始考虑从MySQL迁移到PostgreSQL。这一迁移的主要原因包括以下几个方面:

1.1 性能和扩展性

PostgreSQL以其高性能和优秀的扩展能力而闻名。它支持复杂的查询优化和并发控制,能够更高效地处理大规模数据。与MySQL相比,PostgreSQL在处理复杂查询和大数据集时表现更为出色。

1.2. 标准兼容性和功能丰富

PostgreSQL严格遵循SQL标准,并提供了许多高级功能,如完整的ACID事务支持、复杂的查询和索引功能、存储过程、触发器等。其丰富的功能集使得开发人员能够更加灵活地设计和实现各种数据库应用。

1.3. 开源社区和企业支持

PostgreSQL拥有一个活跃的开源社区和广泛的企业支持。无论是社区版本还是企业版本,用户都可以获得及时的技术支持和更新。这使得PostgreSQL在稳定性和安全性方面具有显著优势。

1.4. 迁移过程中的挑战和注意事项

尽管从MySQL迁移到PostgreSQL带来了诸多优势,但这一过程也伴随着一些挑战和注意事项:

1.4.1. 语法差异

MySQL和PostgreSQL在SQL语法上存在一些差异,特别是在存储过程、函数和触发器的实现上。在迁移过程中,需要对现有的SQL脚本进行适当的调整和转换,以确保在PostgreSQL中能够正常运行。

1.4.2. 数据类型兼容性

两者在数据类型的支持和实现上也存在差异。例如,MySQL的TINYINT在PostgreSQL中没有直接对应的类型,需要转换为SMALLINT。类似的差异需要在迁移前进行详细的审查和处理。

1.4.3. 性能优化

尽管PostgreSQL在性能上具有优势,但迁移后仍需要对系统进行性能调优。包括索引的重新创建、查询的优化等,以充分发挥PostgreSQL的性能优势。

1.4.4. 数据完整性验证

在迁移过程中,确保数据的一致性和完整性至关重要。需要进行全面的数据验证,确保迁移后的数据与原数据完全一致。这包括行数验证、数据对比以及存储过程和函数的功能测试。

1.4.5. 工具的选择

选择合适的迁移工具可以显著简化迁移过程。例如,pgloader、Navicat等工具可以帮助大家完成大部份迁移步骤,减少手动干预的错误风险。关于pgloader的工具使用,可以查看pgloader官方文档,在这里就不赘述了,后续如果有需要可以针对pgloader的使用给大家进行分享。

2. 迁移步骤

将数据从一个数据库系统迁移到另一个数据库系统是一个复杂且关键的任务。以下是从MySQL迁移到PostgreSQL的完整过程,涵盖了所有相关步骤。

2.1 准备工作
2.1.1. 安装并配置MySQL和PostgreSQL

在开始迁移之前,确保MySQL和PostgreSQL都已正确安装并配置。准备工作包括安装和配置数据库系统以及备份MySQL数据库。对于Mysql、PostgreSQL的配置安装可以通过yum或者apt命令进行联网安装,也可以通过二进制进行安装,具体可以参考:

  • PostgreSQL16.3基于CentOS7.9源码安装步骤
  • 数据库MySQL的四种安装方式
2.1.2. 备份MySQL数据库

在进行数据迁移之前,必须备份MySQL数据库以防止数据丢失。备份可以使用mysqldump工具完成。

1.备份整个数据库
使用mysqldump命令导出整个数据库,包括表结构和数据。

mysqldump -u root -p your_database > your_database_backup.sql

2.备份单个表
如果只需要备份特定的表,可以使用以下命令:

mysqldump -u root -p your_database table_name > table_name_backup.sql

3.备份存储过程和函数
使用--routines选项导出存储过程和函数。

mysqldump -u root -p --routines --no-create-info --no-data --skip-triggers your_database > routines_backup.sql

4.验证备份文件
确保备份文件已正确生成,并且可以读取。可以简单地查看备份文件的内容:

less your_database_backup.sql

通过完成以上准备工作,可以确保MySQL和PostgreSQL环境已正确设置,并且数据已备份,为接下来的迁移步骤打下基础。

2.2 迁移表结构

在迁移表结构时,数据类型的转换是关键的一步。MySQL和PostgreSQL在数据类型的支持和实现上有一些差异,需要进行适当的映射和转换。以下是常用数据类型的对比:

数据类型对比

MySQLPostgreSQL说明
TINYINTSMALLINT小范围整数,PostgreSQL没有直接的TINYINT,需要转换为SMALLINT
SMALLINTSMALLINT小范围整数
MEDIUMINTINTEGER中等范围整数,PostgreSQL没有直接的MEDIUMINT,可以转换为INTEGER
INTINTEGER标准整数类型
BIGINTBIGINT大范围整数
FLOATREAL单精度浮点数
DOUBLEDOUBLE PRECISION双精度浮点数
DECIMALDECIMAL精确的小数
NUMERICNUMERIC精确的小数,等同于DECIMAL
CHARCHAR定长字符串
VARCHARVARCHAR可变长度字符串
TINYTEXTTEXT小文本字段,PostgreSQL用TEXT替代
TEXTTEXT文本字段
MEDIUMTEXTTEXT中等大小文本字段,PostgreSQL用TEXT替代
LONGTEXTTEXT大文本字段,PostgreSQL用TEXT替代
DATEDATE日期
DATETIMETIMESTAMP日期和时间,PostgreSQL用TIMESTAMP替代
TIMETIME时间
YEARINTEGER年份,PostgreSQL没有直接的YEAR类型,可以使用INTEGER
ENUMVARCHAR枚举类型,PostgreSQL没有直接的ENUM,可以使用VARCHAR
SETVARCHAR集合类型,PostgreSQL没有直接的SET,可以使用VARCHAR
BLOBBYTEA二进制大对象
TINYBLOBBYTEA小二进制对象,PostgreSQL用BYTEA替代
MEDIUMBLOBBYTEA中等大小二进制对象,PostgreSQL用BYTEA替代
LONGBLOBBYTEA大二进制对象,PostgreSQL用BYTEA替代

迁移步骤:

  1. 导出MySQL表结构: 使用mysqldump命令导出MySQL数据库的表结构。
  2. 转换表结构为PostgreSQL兼容格式: 根据上表中的数据类型对比,手动或使用工具调整导出的SQL文件,确保数据类型在PostgreSQL中正确映射。
  3. 导入到PostgreSQL: 使用psql命令将转换后的表结构导入到PostgreSQL中,创建所需的表和列。

⚠️注意事项:

  1. 在进行数据类型转换时,需特别注意数据类型的精度和范围,确保在PostgreSQL中的数据类型能够满足原MySQL数据的需求。
  2. 特殊数据类型的转化,例如:MySQL当中的TINYINT(1)表示Boolean的字段,在PostgreSQL需要转化为Boolean类型;PostgreSQL没有MySQL的BLOB类型,所以需要把BLOB类型转化为BYTEA
2.3 迁移数据

迁移数据是从MySQL到PostgreSQL过程中最关键的一步。这个过程涉及导出MySQL数据、转换数据格式、导入到PostgreSQL以及验证数据的一致性。以下是详细的步骤描述。

2.3.1. 导出MySQL数据

首先,需要将MySQL数据库中的数据导出为一个文件。这可以通过使用mysqldump工具来实现。

导出步骤:

  1. 打开终端。
  2. 使用mysqldump命令导出数据 mysqldump -u [username] -p [database_name] --no-create-info > data_backup.sql 其中:
  • [username]是MySQL的用户名。
  • [database_name]是要导出的数据库名称。
  • --no-create-info选项表示只导出数据,不包括表结构。
2. 转换数据文件格式

由于MySQL和PostgreSQL的数据格式有所不同,需要将导出的MySQL数据文件转换为适合PostgreSQL的格式。pgloader是一个强大的工具,可以简化这个过程。

转换步骤:

  1. 安装pgloader(如果尚未安装): sudo yum install pgloader -y
  2. 使用pgloader进行数据转换和导入:
    pgloader mysql://[username]:[password]@localhost/[database_name] postgresql://[pg_username]:[pg_password]@localhost/[pg_database_name]
    其中:
  • [username][password]是MySQL的用户名和密码
  • [database_name]是MySQL数据库的名称
  • [pg_username][pg_password]是PostgreSQL的用户名和密码
  • [pg_database_name]是PostgreSQL数据库的名称
3. 导入到PostgreSQL

如果没有使用pgloader,需要手动将数据文件导入到PostgreSQL。

导入步骤:

  1. 打开终端。
  2. 使用psql命令导入数据。 psql -U [pg_username] -d [pg_database_name] -f data_backup.sql 其中:
  • [pg_username]是PostgreSQL的用户名。
  • [pg_database_name]是要导入数据的PostgreSQL数据库名称。
  • data_backup.sql是导出的MySQL数据文件。
4. 数据完整性验证

在数据导入后,需要进行数据完整性验证,以确保数据迁移过程中没有丢失或损坏。

验证步骤:

  1. 行数验证:
    在MySQL和PostgreSQL中分别查询每个表的行数,确保行数一致。 SELECT COUNT(*) FROM table_name;
  2. 数据对比:
    随机抽取若干条记录,比较MySQL和PostgreSQL中的数据是否一致。 SELECT * FROM table_name WHERE id = random_id;
  3. 完整性检查
    确保所有外键、唯一约束等数据库完整性规则在 PostgreSQL 中正确实现
  4. 业务逻辑验证
    使用应用程序的业务逻辑进行数据验证。编写脚本或程序调用应用程序接口,验证数据是否符合预期
  5. 数据范围和分布验证
    验证特定列的数据范围和分布是否一致。例如,检查 日期 列的 最小值 最大值 是否相同
  6. NULL值验证
    检查各个表中 NULL 值的分布是否一致
  7. 聚合函数验证
    使用聚合函数(如: SUM、AVG、MAX、MIN )验证数据的一致性
  8. 应用程序功能测试
    通过应用程序执行常规操作,验证迁移后的数据是否支持应用程序的正常运行。包括数据 插入、更新、删除和查询 等操作

⚠️注意事项:

  1. 字符编码:确保MySQL和PostgreSQL的字符编码一致,避免出现乱码问题。
  2. 事务处理:在数据导入过程中使用事务,以确保数据的一致性和完整性。
  3. 索引和约束:在导入数据前,可以暂时禁用索引和约束,提高数据导入速度。导入完成后再重新在PostgreSQL侧进行重建。
2.4 迁移存储过程和函数

将MySQL的存储过程和函数迁移到PostgreSQL时,需要了解两者之间的系统函数和语法差异。以下是详细的对比表格:

迁移步骤:

  1. 导出MySQL存储过程和函数
    使用mysqldump命令导出MySQL数据库中的存储过程和函数。 mysqldump -u [username] -p --routines --no-create-info --no-data --skip-triggers [database_name] > routines_backup.sql
  2. 转换存储过程和函数为PostgreSQL兼容格式
    手动调整导出的存储过程和函数,使其适应PostgreSQL的语法
  3. 导入到PostgreSQL
    使用psql命令将转换后的存储过程和函数导入到PostgreSQL中。 psql -U [pg_username] -d [pg_database_name] -f routines_backup_pg.sql
2.4.1 系统函数对比
功能MySQLPostgreSQL
当前日期和时间NOW()CURRENT_TIMESTAMP
当前用户CURRENT_USER()CURRENT_USER
字符串长度CHAR_LENGTH(string)LENGTH(string)
数学函数ABS(number), ROUND(number)ABS(number), ROUND(number)
随机数生成RAND()RANDOM()
子字符串SUBSTRING(string, pos, len)SUBSTRING(string FROM pos FOR len)
日期加减DATE_ADD(date, INTERVAL expr unit)date + interval 'expr unit'
日期格式化DATE_FORMAT(date, format)TO_CHAR(date, format)
2.4.2 语法对比
功能/特性MySQLPostgreSQL
存储过程定义CREATE PROCEDURE proc_name (params) BEGIN ... END;CREATE OR REPLACE PROCEDURE proc_name (params) LANGUAGE plpgsql AS $$ BEGIN ... END; $$;
函数定义CREATE FUNCTION func_name (params) RETURNS type BEGIN ... END;CREATE OR REPLACE FUNCTION func_name (params) RETURNS type LANGUAGE plpgsql AS $$ DECLARE ... BEGIN ... END; $$;
参数输入、输出、输入输出参数输入参数(默认),使用INOUTINOUT指定
变量声明DECLARE var_name type;DECLARE var_name type;DECLARE块中
异常处理DECLARE ... HANDLEREXCEPTION
条件控制IF ... THEN ... ELSE ... END IF;IF ... THEN ... ELSE ... END IF;
循环控制WHILE ... DO ... END WHILE;WHILE ... LOOP ... END LOOP;
结果集处理SELECT ... INTO var;SELECT ... INTO var;
2.4.3 示例说明
  • 在MySQL中定义存储过程和函数
-- 存储过程
DELIMITER //
CREATE PROCEDURE example_procedure(IN param1 INT)
BEGINSELECT * FROM example_table WHERE id = param1;
END //
DELIMITER ;-- 函数
DELIMITER //
CREATE FUNCTION example_function(param1 INT) RETURNS INT
BEGINDECLARE result INT;SELECT column INTO result FROM example_table WHERE id = param1;RETURN result;
END //
DELIMITER ;
  • 在PostgreSQL中转换存储过程和函数
-- 存储过程
CREATE OR REPLACE PROCEDURE example_procedure(param1 INT)
LANGUAGE plpgsql
AS $$
BEGINSELECT * FROM example_table WHERE id = param1;
END;
$$;-- 函数
CREATE OR REPLACE FUNCTION example_function(param1 INT) RETURNS INT
LANGUAGE plpgsql
AS $$
DECLAREresult INT;
BEGINSELECT column INTO result FROM example_table WHERE id = param1;RETURN result;
END;
$$;
2.4.3 存储过程和函数测试

迁移完成后,存储过程和函数的测试是确保迁移成功的重要步骤。测试的目的是验证在PostgreSQL中存储过程和函数的功能是否与在MySQL中一致,主要从如下几方面进行测试验证:

  1. 功能测试
    需要确保每个存储过程和函数在PostgreSQL中按预期工作。可以通过创建测试用例来调用每个存储过程和函数,并验证其输出是否正确。例如,对于存储过程get_user_by_id,可以在PostgreSQL中执行CALL get_user_by_id(1);,并检查返回结果是否正确。
  2. 性能测试
    对比MySQL和PostgreSQL中存储过程和函数的执行时间,确保性能没有显著下降。这可以通过在两个数据库中分别执行相同的存储过程或函数,并记录其执行时间来实现。例如,在MySQL中执行CALL get_user_by_id(1);,然后在PostgreSQL中执行相同的命令,并比较执行时间。
  3. 边界测试
    测试存储过程和函数的边界情况,如最大和最小输入值,空值处理,异常情况等。例如,可以在PostgreSQL中执行CALL
    get_user_by_id(NULL);、CALL get_user_by_id(-1);和CALL
    get_user_by_id(99999999);,以确保存储过程和函数能够正确处理各种输入情况。
  4. 集成测试
    通过应用程序执行常规操作,验证迁移后的数据是否支持应用程序的正常运行。这包括在应用程序中调用存储过程和函数,并验证结果是否与预期一致。例如,在Java应用程序中,通过JDBC连接到PostgreSQL数据库,调用存储过程get_user_by_id,并检查返回结果是否正确。

3.注意事项

数据的迁移大多都是基于实际的生成环境中进行,为了尽可能减少对于业务的影响,我们应该通过细致的规划和执行,合理的停机时长规划、应用改造和生产环境验证等来确保迁移过程的顺利和成功,最大程度地减少对业务的影响,一下为在整个迁移过程中需要考虑的注意事项:

1.停机时长的考虑
迁移过程中,停机时长是一个重要的考虑因素。数据量越大,迁移所需的时间越长。因此,建议在数据量较少或业务低峰期进行迁移,以减少对生产环境的影响。为了确保数据的一致性,在停机前需要备份所有数据,并确保在迁移过程中不进行数据修改。
2.缩短停机时间的方法
为了尽可能缩短停机时间,可以考虑使用增量备份和恢复的方法,减少全量数据备份和恢复所需的时间。此外,提前准备好迁移所需的脚本和配置,可以减少实际迁移操作的时间。
3.代码兼容性
迁移过程中,需要修改应用程序的数据库连接配置,确保连接到PostgreSQL。同时,检查并修改应用程序中所有的SQL查询,确保其在PostgreSQL中能够正确执行。尤其注意MySQL特有的语法和函数,需替换为PostgreSQL兼容的语法和函数。
4.功能验证
迁移完成后,需要进行功能验证。编写和执行单元测试,确保应用程序中的所有功能在使用PostgreSQL时能够正常运行。此外,在测试环境中进行全面的集成测试,模拟生产环境中的实际操作,确保所有业务流程能够正常执行。
5.数据验证
数据验证是迁移过程中的关键步骤。使用行数验证、数据对比、校验和验证等方法,确保迁移后数据的完整性和一致性。同时,验证特定列的数据范围和分布是否一致,如日期列的最小值和最大值是否相同。
6.性能验证
性能验证也是迁移过程中不可忽视的一部分。对比迁移前后关键查询的执行时间,确保PostgreSQL中的查询性能满足需求。通过性能测试,确保PostgreSQL中的存储过程和函数的执行时间在可接受范围内。
7.系统稳定性
为了确保系统的稳定性,建议在生产环境中进行压力测试,验证系统在高负载下的稳定性和性能。同时,设置详细的监控和日志记录,及时发现和解决潜在的问题。
8.关键注意事项
在进行任何迁移操作前,务必做好全面的数据备份,以防迁移过程中出现数据丢失或损坏的情况。制定详细的迁移计划,包括每个步骤的时间安排、责任人和应急预案。如果可能,分阶段逐步实施迁移,逐步验证每个阶段的结果,以降低整体迁移的风险。

总结

从MySQL迁移到PostgreSQL是一个复杂但必要的过程,它能够为系统带来更高的性能、丰富的功能集和更强的扩展能力。整个迁移过程包括准备工作、迁移表结构、迁移数据、迁移存储过程和函数以及数据完整性验证。在每个步骤中都需要细致的规划和执行,以确保数据的一致性和完整性。

在迁移过程中,需要仔细考虑停机时长、应用改造以及生产环境中的实际验证。停机时长的规划直接影响业务的连续性,建议在业务低峰期进行迁移,并使用增量备份和恢复的方法以缩短停机时间。应用改造方面,需修改数据库连接配置和SQL查询,确保兼容PostgreSQL。生产环境验证是确保迁移成功的关键步骤,包括数据验证、性能验证和系统稳定性测试。通过行数验证、数据对比、校验和验证等方法,可以确保数据的完整性和一致性。同时,性能测试和压力测试能够确保系统在迁移后的高效稳定运行。

通过细致的规划和执行,从MySQL迁移到PostgreSQL不仅能够提升系统性能,还能为未来的发展打下坚实的基础。希望本文提供的详细步骤和注意事项能够帮助您顺利完成迁移过程,实现系统的平稳过渡和功能增强。

参考链接

以下是一些关于从MySQL迁移到PostgreSQL的参考文章和链接,这些资源可以为您提供更多的技术细节:

  • PostgreSQL Official Documentation
  • MySQL to PostgreSQL Migration Guide
  • pgloader Documentation
  • mysqldump Documentation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/47191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP/IP、UDP、HTTP 协议介绍比较和总结

TCP/IP、UDP、HTTP是网络通信中的三种重要协议,各自具有不同的特点和应用场景。以下是对这三种协议的详细介绍、比较和总结。 TCP/IP协议 传输控制协议/互联网协议(TCP/IP, Transmission Control Protocol/Internet Protocol) 特点: 可靠性:TCP提供可靠的通信,通过握手…

深度学习入门——神经网络

前言 神经网络可以帮助自动化设定权重 具体地讲,神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数 从感知机到神经网络 神经网络的例子 中间层aka隐藏层 复习感知机 偏置b 并没有被画出来。如果要明确地表示出b,可以像图3-3那样做…

搜维尔科技:使用远程TCP和刀具路径遥操作点胶

使用远程TCP和刀具路径遥操作点胶 搜维尔科技:使用远程TCP和刀具路径遥操作点胶

Large Language Model系列之一:语言模型与表征学习(Language Models and Representation Learning)

语言模型与表征学习(Language Models and Representation Learning) 1 语言模型 N-Gram模型 from collections import defaultdictsentences [The swift fox jumps over the lazy dog.,The swift river flows under the ancient bridge.,The swift br…

华为1000人校园实验记录

在这里插入代码片1000人校园区网设计 1、配置Eth-trunk实现链路冗余 vlan 900 管理WLAN #接入SW8 操作:sys undo in en sysname JR-SW8 int Eth-Trunk 1 mode lacp-static trunkport g0/0/1 0/0/2 port link-type trunk port trunk allow-pass vlan 200 900 qu vla…

Linux C++ 056-设计模式之迭代器模式

Linux C 056-设计模式之迭代器模式 本节关键字:Linux、C、设计模式、迭代器模式 相关库函数: 概念 迭代器模式(Iterator Pattern)是一种常用的设计模式。迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而…

模拟器小程序/APP抓包(Reqable+MUMU模拟器)

一、使用adb连接上MUMU模拟器 打开多开器点击ADB图标 连接模拟器端口: adb connect 127.0.0.1:16384列出已连接的设备: adb devices正常会显示MuMu的设备已连接 二、下载Reqable 1.下载链接:客户端下载 | Reqable 2.文档链接:…

Bigdata-Docker构建大数据学习开发环境

Bigdata-Docker构建大数据学习开发环境 介绍 1、镜像环境 系统:centos 7Java :java7Zookeeper: 3.4.6Hadoop: 2.7.1mysql: 5.6.29Hive: 1.2.1Spark: 1.6.2Hbase: 1.1.2 2、镜像介绍 tonywell/centos-java:openssh、java7,基础…

示例:在WPF ListBox中,ScrollViewer.CanContentScroll=“False“破坏虚拟化如何解决

一、目的:分享一个解决ListBox设置了ScrollViewer.CanContentScroll"False"破坏虚拟坏的解决方法 ScrollViewer.CanContentScroll 是 WPF 中 ScrollViewer 控件的一个属性,它决定了滚动内容时是按逻辑单位(如项)还是按物…

redis基本类型和订阅

redis-cli -h <host> -p <port> -a <password> 其中&#xff0c;< host>是Redis服务器的主机名或IP地址&#xff0c;< port>是Redis服务器的端口号&#xff0c;< password>是Redis服务器的密码&#xff08;如果有的话&#xff09;。 set …

在项目中,如何使用springboot+vue+springsecurity+redis缓存+Axios+MySQL数据库+mybatis

要在项目中使用springbootvuespringsecurityredis缓存AxiosMySQL数据库mybatis&#xff0c;可以按照以下步骤进行操作&#xff1a; 创建一个Spring Boot项目&#xff0c;并添加所需的依赖。在pom.xml文件中添加Spring Boot、Spring Security、Redis、MySQL和MyBatis的依赖项。 …

JAVA学习-练习试用Java实现“只出现一次的数字 II”

问题&#xff1a; 给定一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请找出并返回那个只出现了一次的元素。 示例 1&#xff1a; 输入&#xff1a;nums [2,2,3,2] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xf…

从零手写实现 nginx-30-upstream+proxy_pass 反向代理指令介绍

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

LLM基础模型系列:Prompt-Tuning

------->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<------ 大型预训练语言模型的规模不断扩大&#xff0c;在许多自然语言处理 &#xff08;NLP&#xff09; 基准测试中取得了最先进的结果。自GPT和BERT开发以来&#xff0c;标准做法一直是在下游…

SCP 使用教程

SCP&#xff08;Secure Copy Protocol&#xff09;是一种通过加密的方式在本地主机和远程主机之间安全地传输文件的协议。它是基于SSH协议的扩展&#xff0c;允许用户在不同主机之间进行文件复制和传输&#xff0c;是Linux和Unix系统中常用的工具之一。本教程将详细介绍SCP的基…

migrate table com.finebi.persist.impl.entity.PackageSubItemEntity failed

记录一个报错解决过程&#xff0c;finebi在连接外部mysql时&#xff0c;要把finebi里的表导入到mysql&#xff0c;但是如果mysql库不是utf8就会报错如下migrate table com.finebi.persist.impl.entity.PackageSubItemEntity failed 解决方法&#xff1a;用下面语句创建的库是…

数字化教育资源如何适应人工智能时代

01 教育资源应动态适应一线教学需求 用好数字化教育资源是一项系统工程&#xff0c;涉及教育教学的各个方面&#xff0c;包括教师和学生的教育观念与技术观念、信息技术素养&#xff0c;以及课程教学改革、教师培训等。还涉及数字化教育资源提供方的服务&#xff0c;如技术支持…

【STM32嵌入式系统设计与开发---拓展】——1_9_1上拉输入和下拉输入

在使用GPIO引脚时&#xff0c;上拉输入和下拉输入的选择取决于外部电路的特性和应用需求。以下是它们各自的应用场景&#xff1a; 1、上拉输入&#xff08;Pull-up Input&#xff09; 用途: 当默认状态需要为高电平时。 避免引脚悬空&#xff08;floating&#xff09;导致的…

计算机网络——网络层(路由选择协议、路由器工作原理、IP多播、虚拟专用网和网络地址转换)

目录 路由选择协议 因特网的路由选择协议特点 路由信息协议RIP RIP衡量目的网络距离 RIP选择路由器的方式 RIP具有以下三个重要特点 RIP的基本工作流程 RIP的距离向量算法 ​编辑 ​编辑 RIP存在的问题——“坏消息传播得慢” RIP的封装 开放最短路径优先协议OSPF…

在CSS中,使用Flexbox布局时,可以通过几个属性来控制容器内的项目之间的间距

display弹性布局&#xff0c;flex:1是占据剩下的空间 关于displa:flex /* 水平和垂直居中&#xff0c;水平和垂直方向上的间距均匀分布 / .container { display: flex; justify-content: space-between; / 左右对齐 / align-items: center; / 上下间距 */ flex-direction: ro…