`
simonhoo
  • 浏览: 70894 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

配置Oracle Stream

 
阅读更多

Oracle Stream功能是为提高数据库的高可用性而设计的,在Oracle 9i及之前的版本这个功能被称为Advance Replication。Oracle Stream利用高级队列技术,通过解析归档日志,将归档日志解析成DDL及DML语句,从而实现数据库之间的同步。这种技术可以将整个数据库、数据库中的对象复制到另一数据库中,通过使用Stream的技术,对归档日志的挖掘,可以在对主系统没有任何压力的情况下,实现对数据库对象级甚至整个数据库的同步。

  解析归档日志这种技术现在应用的比较广泛,Quest公司的shareplex软件及DSG公司的realsync都是这样的产品,一些公司利用这样的产品做应用级的容灾。但shareplex或是realsync都是十分昂贵的,因此你可以尝试用Stream这个Oracle提供的不用额外花钱的功能。Oracle Stream对生产库的影响是非常小的,从库可以是与主库不同的操作系统平台,你可以利用Oracle Stream复制几个从库,从库可用于查询、报表、容灾等不同的功能。本文不谈技术细节,只是以手把手的方式一步一步的带你把Stream的环境搭建起来,细节内容可以查联机文档。

 

环境:

主数据库:

  操作系统:Solaris 9

  IP地址:192.168.10.35

  数据库:Oracle 10.2.0.2

  ORACLE_SID:prod

  Global_name:prod

从数据库:

  操作系统:AIX 5.2

  IP地址:192.168.10.43

  数据库:Oracle 10.2.0.3

  ORACLE_SID:h10g

  Global_name:h10g

 

 

设定初始化参数:

使用pfile的修改init.ora文件,使用spfile的通过alter system命令修改spile文件。主、从数据库分别执行如下的语句:

      Sqlplus ‘/ as sysdba’ 
  alter system set aq_tm_processes=2 scope=both; 
  alter system set global_names=true scope=both; 
  alter system set job_queue_processes=10 scope=both; 
  alter system set parallel_max_servers=20 scope=both; 
  alter system set undo_retention=3600 scope=both; 
  alter system set nls_date_format='YYYY-MM-DD HH24:MI:SS' scope=spfile; 
  alter system set streams_pool_size=25M scope=spfile; 
  alter system set utl_file_dir='*' scope=spfile; 
  alter system set open_links=4 scope=spfile;

 执行完毕后重启数据库。

 

数据库置为归档模式:

设置log_archive_dest_1到相应的位置;设定log_archive_start为TRUE,即启用自动归档功能;设定log_archive_format指定归档日志的命令格式。

举例:

      sqlplus ‘/ as sysdba’ 
  alter system set log_archive_dest_1=’location=/yang/arch’ scope=spfile; 
  alter system set log_archive_start=TRUE scope=spfile; 
  alter system set log_archive_format=’ arch%t_%s_%r.arc’ scope=spfile; 
  shutdown immediate; 
  startup mount; 
  alter database archivelog; 
  alter database open;

 

数据库置为归档模式后,可以按如下方式检验一下:

      archive log list 
  Database log mode Archive Mode 
  Automatic archival Enabled 
  Archive destination /yang/arch 
  Oldest online log sequence 534 
  Next log sequence to archive 536 
  Current log sequence 536

 

 

创建stream 管理用户:

   创建主环境stream管理用户:

   

#以sysdba身份登录 
  connect / as sysdba 
  #创建主环境的Stream专用表空间 
  create tablespace tbs_stream datafile '/yang/oradata/prod/tbs_stream01.dbf' 
  size 100m autoextend on maxsize unlimited segment space management auto; 
  #将logminer的数据字典从system表空间转移到新建的表空间,防止撑满system表空间 
  execute dbms_logmnr_d.set_tablespace('tbs_stream'); 
  #创建Stream管理用户 
  create user strmadmin identified by strmadmin 
  default tablespace tbs_stream temporary tablespace temp; 
  #授权Stream管理用户 
  grant connect,resource,dba,aq_administrator_role to strmadmin; 
  begin 
  dbms_streams_auth.grant_admin_privilege( 
  grantee => 'strmadmin', 
  grant_privileges => true); 
  end; 
  /

 

   创建从环境stream管理用户:

#以sysdba身份登录 
  connect / as sysdba 
  #创建Stream专用表空间,我的从库用了ASM,这一步也可以参见3.3.1 
  create tablespace tbs_stream datafile '+VGDATA/h10g/datafile/tbs_stream01.dbf' 
  size 100m autoextend on maxsize unlimited segment space management auto; 
  #同样,将logminer的数据字典从system表空间转移到新建的表空间,防止撑满system表空间 
  execute dbms_logmnr_d.set_tablespace('tbs_stream'); 
  #创建Stream管理用户 
  create user strmadmin identified by strmadmin 
  default tablespace tbs_stream temporary tablespace temp; 
  #授权Stream管理用户 
  grant connect,resource,dba,aq_administrator_role to strmadmin; 
  begin 
  dbms_streams_auth.grant_admin_privilege( 
  grantee => 'strmadmin', 
  grant_privileges => true); 
  end; 
  /

 

配置网络连接:

配置主环境tnsnames.ora:

主数据库(tnsnames.ora)中添加从数据库的配置。

H10G = 
  (DESCRIPTION = 
  (ADDRESS_LIST = 
  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.43)(PORT = 1521)) 
  ) 
  (CONNECT_DATA = 
  (SID = h10g) 
  (SERVER = DEDICATED) 
  ) 
  )

 配置从环境tnsnames.ora:

从数据库(tnsnames.ora)中添加主数据库的配置。

PROD = 
  (DESCRIPTION = 
  (ADDRESS_LIST = 
  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.35)(PORT = 1521)) 
  ) 
  (CONNECT_DATA = 
  (SID = prod) 
  (SERVER = DEDICATED) 
  ) 
  )

 

启用追加日志:

可以基于Database级别或Table级别,启用追加日志(Supplemental Log)。在建立根据Schema粒度进行复制的Oracle Stream环境中,如果确认Schema下所有Table都有合理的主键(Primary Key),则不再需要启用追加日志。

#启用Database 追加日志 
  alter database add supplemental log data; 
  #启用Table追加日志 
  alter table add supplement log group log_group_name(table_column_name) always;

 

创建DBlink

  根据Oracle 10gR2 Stream官方文档,针对主数据库建立的数据库链的名字必须和从数据库的global_name相同。

  如果需要修改global_name,执行“alter database rename global_name to xxx”。

  

创建主数据库数据库链

  #以strmadmin身份,登录主数据库。

  connect strmadmin/strmadmin

  #建立数据库链

  create database link h10g connect to strmadmin identified by strmadmin using 'h10g';

  

创建从数据库数据库链

  #以strmadmin身份,登录从数据库。

  connect strmadmin/strmadmin

  #建立数据库链

  create database link prod connect to strmadmin identified by strmadmin using 'prod';

  

创建流队列

  

创建Master流队列

以下是引用片段:
  #以strmadmin身份,登录主数据库。
  connect strmadmin/strmadmin
  begin
  dbms_streams_adm.set_up_queue(
  queue_table => 'prod_queue_table',
  queue_name => 'prod_queue');
  end;
  /

 

创建Backup流队列

以下是引用片段:
  #以strmadmin身份,登录从数据库。
  connect strmadmin/strmadmin
  begin
  dbms_streams_adm.set_up_queue(
  queue_table => 'h10g_queue_table',
  queue_name => 'h10g_queue');
  end;
  /

  

 创建捕获进程

以下是引用片段:
  #以strmadmin身份,登录主数据库。提醒一下,本文档以hr用户做示例。
  connect strmadmin/strmadmin
  begin
  dbms_streams_adm.add_schema_rules(
  schema_name => 'hr',
  streams_type => 'capture',
  streams_name => 'capture_prod',
  queue_name => 'strmadmin.prod_queue',
  include_dml => true,
  include_ddl => true,
  include_tagged_lcr => false,
  source_database => null,
  inclusion_rule => true);
  end;
  /

  

实例化复制数据库

  在主数据库环境中,执行如下Shell语句。如果从库的hr用户不存在,建立一个hr的空用户。

  exp userid=hr/hr@prod file='/tmp/hr.dmp' object_consistent=y rows=y

  imp userid=system/manager@h10g file='/tmp/hr.dmp' ignore=y commit=y log='/tmp/hr.log' streams_instantiation=y fromuser=hr touser=hr

  

 创建传播进程

以下是引用片段:
  #以strmadmin身份,登录主数据库。
  connect strmadmin/strmadmin
  begin
  dbms_streams_adm.add_schema_propagation_rules(
  schema_name => 'hr',
  streams_name => 'prod_to_h10g',
  source_queue_name => 'strmadmin.prod_queue',
  destination_queue_name => 'strmadmin.h10g_queue@h10g',
  include_dml => true,
  include_ddl => true,
  include_tagged_lcr => false,
  source_database => 'prod',
  inclusion_rule => true);
  end;
  /
  #修改propagation休眠时间为0,表示实时传播LCR。
  begin
  dbms_aqadm.alter_propagation_schedule(
  queue_name => 'prod_queue',
  destination => 'h10g',
  latency => 0);
  end;
  /

 

创建应用进程

以下是引用片段:
  #以strmadmin身份,登录从数据库。
  connect strmadmin/strmadmin
  begin
  dbms_streams_adm.add_schema_rules(
  schema_name => 'hr',
  streams_type => 'apply',
  streams_name => 'apply_h10g',
  queue_name => 'strmadmin.h10g_queue',
  include_dml => true,
  include_ddl => true,
  include_tagged_lcr => false,
  source_database => 'prod',
  inclusion_rule => true);
  end;
  /

  

 启动STREAM

以下是引用片段:
  #以strmadmin身份,登录从数据库。
  connect strmadmin/strmadmin
  #启动Apply进程
  begin
  dbms_apply_adm.start_apply(
  apply_name => 'apply_h10g');
  end;
  /
  #以strmadmin身份,登录主数据库。
  connect strmadmin/strmadmin
  #启动Capture进程
  begin
  dbms_capture_adm.start_capture(
  capture_name => 'capture_prod');
  end;
  /

  

 停止STREAM

以下是引用片段:
  #以strmadmin身份,登录主数据库。
  connect strmadmin/strmadmin
  #停止Capture进程
  begin
  dbms_capture_adm.stop_capture(
  capture_name => 'capture_prod');
  end;
  /
  #以strmadmin身份,登录从数据库。
  connect strmadmin/strmadmin
  #停止Apply进程
  begin
  dbms_apply_adm.stop_apply(
  apply_name => 'apply_h10g');
  end;
  /

 

  清除所有配置信息

  要清楚Stream配置信息,需要先执行3.13,停止Stream进程。

以下是引用片段:
  #以strmadmin身份,登录主数据库。
  connect strmadmin/strmadmin
  exec DBMS_STREAMS_ADM.remove_streams_configuration();
  #以strmadmin身份,登录从数据库。
  connect strmadmin/strmadmin
  exec DBMS_STREAMS_ADM.remove_streams_configuration();

  4 测试场景

  本文档建立了针对hr用户的Stream 复制环境,如果没有特别声明,以下测试场景均以hr用户身份执行。

  

  建一张表测试

  主数据库

  SQL> CREATE TABLE TTT(id NUMBER PRIMARY KEY,

  2 name VARCHAR2(50)

  3 )

  4 /

  Table created.

  从数据库

  SQL> desc TTT

  Name Null? Type

  ---------- -------- -------------

  ID NOT NULL NUMBER

  NAME VARCHAR2(50)

  

  表中插入一行数据

  主数据库

  SQL> insert into ttt values (1,'sdfsdfsdfsdf');

  1 row created.

  SQL> commit;

  Commit complete.

  SQL>

  从数据库

  SQL> select * from TTT;

  ID NAME

  ---------- --------------------

  1 sdfsdfsdfsdf

  

  变更一下表的结构,添加一列

  主数据库

  SQL> ALTER TABLE TTT ADD(age NUMBER(2));

  Table altered

  从数据库

  SQL> desc TTT

  Name Null? Type

  ----------- -------- --------------

  ID NOT NULL NUMBER

  NAME VARCHAR2(50)

  AGE NUMBER(2)

  

   将表换一个表空间

  主数据库

  SQL> SELECT table_name,tablespace_name FROM user_tables

  2    WHERE table_name='TTT';

  TABLE_NAME TABLESPACE_NAME

  ------------------------------ ------------------------------

  TTT USERS

  SQL> ALTER TABLE TTT MOVE TABLESPACE tbs_stream;

  Table altered

  SQL> SELECT table_name,tablespace_name FROM user_tables

  WHERE table_name='TTT';

  TABLE_NAME TABLESPACE_NAME

  ------------------------------ ------------------------------

  TTT TBS_STREAM

  从数据库

  SQL> SELECT table_name,tablespace_name FROM user_tables

  WHERE table_name='TTT';

  TABLE_NAME TABLESPACE_NAME

  ------------------------------ ------------------------------

  TTT TBS_STREAM

 

  

   表上Name列建一索引

  主数据库

  SQL> CREATE INDEX ttt_name_idx ON TTT(name);

  Index created

  从数据库

  SQL> SELECT table_name, index_name FROM user_indexes WHERE table_name = 'TTT';

  TABLE_NAME INDEX_NAME

  ------------------------------     ------------------------------

  TTT TTT_NAME_IDX

  TTT SYS_C005721

  

   Rebuild索引测试

  主数据库

  SQL> ALTER INDEX ttt_name_idx REBUILD;

  Index altered

  从数据库

  SQL> SELECT table_name, index_name FROM user_indexes WHERE table_name = 'TTT';

  TABLE_NAME INDEX_NAME

  ------------------------------     ------------------------------

  TTT TTT_NAME_IDX

  TTT SYS_C005721

  

   索引换一个表空间测试

  主数据库

  SQL> ALTER INDEX ttt_name_idx REBUILD TABLESPACE tbs_stream;

  Index altered

  从数据库

  SQL> SELECT table_name,index_name,tablespace_name FROM user_indexes

  WHERE table_name = 'TTT';

  TABLE_NAME INDEX_NAME TABLESPACE_NAME

  ------------------------------ ------------------------------ ------------------------------

  TTT TTT_NAME_IDX TBS_STREAM

  TTT SYS_C005721 USERS

 

   删除索引测试

  主数据库

  SQL> DROP INDEX ttt_name_idx;

  Index dropped

  从数据库

  SQL> SELECT table_name,index_name,tablespace_name FROM user_indexes

  WHERE table_name = ‘TTT’;

  TABLE_NAME INDEX_NAME TABLESPACE_NAME

  ------------------------------ ------------------------------ ------------------------------

  TTT SYS_C005721 USERS

  

   删除表测试

  主数据库

  SQL> DROP TABLE ttt;

  Table dropped

  从数据库

  SQL> DESC ttt;

  Object ttt does not exist.

 

   建一张带有LOB类型字段的表测试

  主数据库

  SQL> CREATE TABLE tttclob(id NUMBER PRIMARY KEY, memo CLOB);

  Table created

  从数据库

  SQL> DESC tttclob;

  Name Null? Type

  ----------- -------- --------------

  ID NOT NULL NUMBER

  MEMO CLOB

 

   表中插入一行数据

  主数据库

  SQL> INSERT INTO tttclob VALUES(1,'clob_test');

  1 row inserted

  SQL> commit;

  Commit complete

  从数据库

  SQL> SELECT * FROM tttclob;

  ID MEMO

  ---------- --------------------------------------------------------------------------------

  1 clob_test

  

    创建Type测试

  主数据库

  SQL> CREATE or REPLACE TYPE ttttype;

  2 /

  Type created

  从数据库

  SQL> SELECT * FROM user_types WHERE type_name='TTTTYPE';

  TYPE_NAME TYPE_OID TYPECODE ATTRIBUTES METHODS PREDEFINED INCOMPLETE FINAL INSTANTIABLE SUPERTYPE_OWNER SUPERTYPE_NAME LOCAL_ATTRIBUTES LOCAL_METHODS TYPEID

  ------------------------------ -------------------------------- ------------------------------ ---------- ---------- ---------- ---------- ----- ------------ ------------------------------ ------------------------------ ---------------- ------------- --------------------------------

  TTTTYPE 1B36AAF10DA8301DE040A8C0289A77B4 OBJECT 0 0 NO YES YES YES

  

    删除Type测试

  主数据库

  SQL> DROP TYPE ttttype;

  Type dropped

  从数据库

  SQL> SELECT * FROM user_types WHERE type_name='TTTTYPE';

  TYPE_NAME TYPE_OID TYPECODE ATTRIBUTES METHODS PREDEFINED INCOMPLETE FINAL INSTANTIABLE SUPERTYPE_OWNER SUPERTYPE_NAME LOCAL_ATTRIBUTES LOCAL_METHODS TYPEID

  ------------------------------ -------------------------------- -


 问题诊断

  如何知道捕捉(Capture)进程是否运行正常?

  以strmadmin身份,登录主数据库,执行如下语句:

  SQL> SELECT CAPTURE_NAME,

  2 QUEUE_NAME,

  3 RULE_SET_NAME,

  4      NEGATIVE_RULE_SET_NAME,

  5 STATUS

  6 FROM DBA_CAPTURE;

  结果显示如下:

  CAPTURE_NAME QUEUE_NAME

  ------------------------------ ------------------------------

  RULE_SET_NAME NEGATIVE_RULE_SET_NAME STATUS

  ------------------------------ ------------------------------ --------

  CAPTURE_PROD PROD_QUEUE

  RULESET$_14 ENABLED

  ENABLED

  如果STATUS状态是ENABLED,表示Capture进程运行正常;

  如果STATUS状态是DISABLED,表示Capture进程处于停止状态,只需重新启动即可;

  如果STATUS状态是ABORTED,表示Capture进程非正常停止,查询相应的ERROR_NUMBER、ERROR_MESSAGE列可以得到详细的信息;同时,Oracle会在跟踪文件中记录该信息。

  

      如何知道Captured LCR是否有传播GAP?

  以strmadmin身份,登录主数据库,执行如下语句:

  SQL> SELECT CAPTURE_NAME, QUEUE_NAME, STATUS, CAPTURED_SCN, APPLIED_SCN

  2 FROM DBA_CAPTURE;

  结果显示如下:

  CAPTURE_NAME QUEUE_NAME STATUS

  ------------------------------ ------------------------------ --------

  CAPTURED_SCN APPLIED_SCN

  ------------ -----------

  CAPTURE_PROD PROD_QUEUE ENABLED

  17023672 17023672

  如果APPLIED_SCN小于CAPTURED_SCN,则表示在主数据库一端,要么LCR没有被dequeue,要么Propagation进程尚未传播到从数据库一端。

 

  如何知道Appy进程是否运行正常?

  以strmadmin身份,登录从数据库,执行如下语句:

  SQL> SELECT apply_name, apply_captured, status FROM dba_apply;

  结果显示如下:

  APPLY_NAME APPLY_ STATUS

  ---------------------- ------ ----------------

  APPLY_H10G YES ENABLED

  如果STATUS状态是ENABLED,表示Apply进程运行正常;

  如果STATUS状态是DISABLED,表示Apply进程处于停止状态,只需重新启动即可;

  如果STATUS状态是ABORTED,表示Apply进程非正常停止,查询相应的ERROR_NUMBER、ERROR_MESSAGE列可以得到详细的信息;同时,可以查询DBA_APPLY_ERROR视图,了解详细的Apply错误信息。

  通过如上的测试可以看出stream的功能还是十分强大的,通过配置Oracle Stream可以更大的提升数据库的可用性和安全性,如此一个好用且不用花费高昂额外费用的功能还是很值得一用的。

 

 

分享到:
评论

相关推荐

    55links友情链接网址跟踪器

    55links友情链接网址跟踪器,放在桌面,每次直接打开就可以访问55links友情链接交易平台,方便快捷。

    [AB PLC例程源码][MMS_046180]CompactFlash Data Storage.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    moore_01_0909.pdf

    moore_01_0909

    FIBR English learning

    FIBR English learning

    [AB PLC例程源码][MMS_042350]How to send-receive SMS text messages using Westermo modem.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    OIF_IEEE802.3_liaison_19OCt09.pdf

    OIF_IEEE802.3_liaison_19OCt09

    SerU,做网络安全FTP内容的实验必备

    做网络安全FTP内容的实验必备

    nagarajan_01_1107.pdf

    nagarajan_01_1107

    [AB PLC例程源码][MMS_043879]Programming in SFC and ST Language.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    mellitz_3cd_01_0318.pdf

    mellitz_3cd_01_0318

    PyQt6实战派 配套代码

    PyQt6实战派 配套代码

    陕西省省级非物质文化遗产民俗经纬度数据统计表

    陕西省省级非物质文化遗产经纬度数据统计表 统计内容包含以下字段: 1. 项目名称 2. 遗产类别 3. 入选批次 4. 所属地区 5. 申报地区/单位 6. 地理经度 7. 地理纬度 该统计表系统记录了陕西省省级非物质文化遗产的地理空间信息,为文化遗产的数字化保护与研究工作提供了重要的数据支撑。

    ran_3ck_02a_0918.pdf

    ran_3ck_02a_0918

    毕业设计-基于springboot+vue开发的汽车租赁管理系统【源码+sql+可运行】50308.zip

    毕业设计_基于springboot+vue开发的汽车租赁管理系统【源码+sql+可运行】【50308】.zip 全部代码均可运行,亲测可用,尽我所能,为你服务; 1.代码压缩包内容 代码:springboo后端代码+vue前端页面代码; 脚本:数据库SQL脚本 效果图:运行结果请看资源详情效果图 2.环境准备: - JDK1.8+ - maven3.6+ - nodejs14+ - mysql5.6+ - redis 3.技术栈 - 后台:springboot+mybatisPlus+Shiro - 前台:vue+iview+Vuex+Axios - 开发工具: idea、navicate 4.功能列表 - 系统设置:用户管理、角色管理、资源管理、系统日志 - 业务管理:汽车管理、客户管理、租赁订单 3.运行步骤: 步骤一:修改数据库连接信息(ip、port修改) 步骤二:找到启动类xxxApplication启动 4.若不会,可私信博主!!!

    Runcorder - 跑步训练管理系统

    # Runcorder - 跑步训练管理系统 Runcorder 是一款专为跑步爱好者、马拉松运动员及高校体育生设计的本地化跑步训练管理工具,基于 Python 开发,结合 Tkinter 图形界面与强大的数据处理能力,为用户提供从训练记录到数据分析的全方位支持。无论是初学者还是专业跑者,Runcorder 都能帮助你科学规划训练、精准追踪进度,并通过可视化图表直观呈现训练成果,让你的跑步训练更智能、更高效! - **多用户管理**:支持创建、加载和删除用户档案,每个用户的数据独立存储,确保隐私与安全。 - **科学训练记录**:全维度记录跑步数据,包括日期、里程、配速、自评和晨跑标记,支持智能输入校验,避免数据错误。 - **多维数据分析**:通过动态可视化图表展示跑步里程趋势、平均配速曲线,支持自定义 Y 轴范围,帮助用户深入理解训练效果。 - **高阶功能**:提供 4 种科学训练模式(有氧/无氧/混合),支持历史记录修改与删除,数据以 JSON 格式持久化存储,跨平台兼容。

    paatzsch_01_0708.pdf

    paatzsch_01_0708

    开源AI工具下载——AnythingLLMDesktop1.7.3-r2 windows版

    AnythingLLM是一个全栈应用程序,您可以使用流行的开源大语言模型,再结合向量数据库解决方案构建个人本地AI大模型知识库

    mellitz_3ck_02_0519.pdf

    mellitz_3ck_02_0519

    petrilla_01_0708.pdf

    petrilla_01_0708

    ran_3ck_01_0918.pdf

    ran_3ck_01_0918

Global site tag (gtag.js) - Google Analytics