IvorySQL 深度解析:融合 PostgreSQL 生态与 Oracle 兼容性的革新之路

PostgreSQL 18.3与IvorySQL 5.3:AI数据库新纪元开启 随着AI应用深入各行各业,数据库的角色正从数据存储工具演变为智能数据基础设施。向量检索、RAG等场景对数据库提出了融合结构化查询与语义匹配的新要求。PostgreSQL 18.3作为年度大版本的重要补丁,在性能、可管理性与AI基础设施方面持续夯实;而IvorySQL 5.3则通过增强Oracle兼容性并深度集成AI能力,让企业可以在不推翻现有技术栈的前提下,直接获得内置的向量索引、混合查询与外部推理支持。两者结合,不仅简化了RAG系统的数据管道,也为从传统数据库向AI原生数据库演进提供了平滑路径。本文从版本 阅读详情

引言:数据库领域的 “最佳桥梁”

在当今多元化的数据库技术栈中,企业常常面临一个两难选择:是拥抱开源、生态丰富、性能卓越的 PostgreSQL,还是沿用商业强大、生态成熟但成本高昂的 Oracle 数据库?迁移的复杂性、高昂的许可费用以及对现有应用的兼容性担忧,往往让企业在技术选型和迁移上举步维艰。

IvorySQL 正是在这一背景下应运而生。它并非一个简单的数据库,而是一个旨在架起 PostgreSQL 与 Oracle 之间桥梁的革新性开源项目。它基于 PostgreSQL 开发,在保持与原版数据库 100% 语法兼容的同时,深度兼容 Oracle 语法,为企业提供了一条平滑、低成本的迁移与融合路径。

核心定位:生于 PostgreSQL,优于 Oracle 兼容

IvorySQL 的核心哲学可以概括为:以 PostgreSQL 为基石,以 Oracle 兼容性为核心。

坚守开源与 PostgreSQL 生态

IvorySQL 社区明确承诺,始终与 PostgreSQL 数据库保持 100% 兼容,并可直接替换最新版本的 PostgreSQL。这意味着 PostgreSQL 强大的扩展生态系统(如 PostGIS、pgvector、pg_cron 等)在 IvorySQL 中得以完整保留,用户无需担心失去 PostgreSQL 带来的灵活性、完整性和可靠性。

强大的 Oracle 兼容性

这是 IvorySQL 区别于其他基于 PostgreSQL 的分支的核心竞争力。它不仅仅是对少量 Oracle 函数和语法的简单映射,而是提供了一个系统性、深层次的兼容方案。其关键在于 ivorysql.compatible_mode 这个 GUC 参数。通过将其设置为 oracle 或 pg,用户可以在同一套数据库系统内,无缝切换 Oracle 兼容模式和原生 PostgreSQL 模式,这在数据库产品中是极为创新的设计。

深度技术解析:如何实现 “无缝兼容”?

IvorySQL 的 Oracle 兼容性并非空中楼阁,而是通过一系列精心设计的技术特性实现的。

1. GUC 参数驱动的双模式与初始化

ivorysql.compatible_mode 是贯穿 IvorySQL 的灵魂参数。

初始化时指定模式

初始化为纯 PostgreSQL 模式

initdb -D /usr/ivory-5/data -m pg

如果使用 -m pg 模式,ivorysql.compatible_mode 参数将失效,系统行为与原生 PostgreSQL 完全一致。

初始化为 Oracle 兼容模式(默认)

initdb -D /usr/ivory-5/data -m oracle

运行时动态切换

初始化后,可以在会话级别动态切换模式,实现 “一库两用”:

-- 默认是Oracle模式
SHOW ivorysql.compatible_mode;
-- 输出: oracle

-- 临时切换到纯PG模式,处理原生PG语法
SET ivorysql.compatible_mode TO pg;
SHOW ivorysql.compatible_mode;
-- 输出: pg

2. PL/iSQL:Oracle PL/SQL 的无缝兼容

这是 IvorySQL 最具亮点的特性。PL/iSQL 过程语言可以完整兼容 Oracle 的 PL/SQL 语法。

匿名块兼容

DECLARE
    i integer := 10;
    grade CHAR(1) := 'B';
BEGIN
    CASE grade
        WHEN 'A' THEN RAISE NOTICE 'Excellent';
        WHEN 'B' THEN RAISE NOTICE 'Very Good';
    END CASE;
EXCEPTION
    WHEN CASE_NOT_FOUND THEN
        RAISE NOTICE 'No such grade';
END;
/
-- 输出: NOTICE:  Very Good

函数兼容

-- 创建Oracle风格函数
CREATE OR REPLACE FUNCTION add_numbers(p_a NUMBER, p_b NUMBER) RETURN NUMBER IS
BEGIN
    RETURN p_a + p_b;
END;
/

-- 调用(可省略括号,Oracle风格)
SELECT add_numbers FROM dual;
包(PACKAGE)兼容
sql
-- 创建包规范
CREATE OR REPLACE PACKAGE my_pkg IS
    var1 INTEGER;
    FUNCTION get_double(p_id INTEGER) RETURN INTEGER;
    PROCEDURE print_message(p_msg VARCHAR2);
END my_pkg;
/

-- 创建包体
CREATE OR REPLACE PACKAGE BODY my_pkg IS
    FUNCTION get_double(p_id INTEGER) RETURN INTEGER IS
    BEGIN
        RETURN p_id * 2;
    END;
    PROCEDURE print_message(p_msg VARCHAR2) IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE(p_msg);
    END;
-- 初始化块
BEGIN
    var1 := 100;
END my_pkg;
/

-- 调用包中的函数和过程
SELECT my_pkg.get_double(5) FROM dual;
-- 输出: 10

CALL my_pkg.print_message('Hello from IvorySQL Package!');

3. 数据类型与函数

IvorySQL 支持大量 Oracle 独有的数据类型和函数,大幅降低迁移成本。

VARCHAR2 类型

CREATE TABLE customers (
    cust_id NUMBER PRIMARY KEY,
    cust_name VARCHAR2(100)  -- 非标准PG类型,IvorySQL兼容
);

常用内置函数

-- SYSDATE
SELECT SYSDATE FROM dual;

-- ADD_MONTHS
SELECT ADD_MONTHS(SYSDATE, 3) FROM dual;

-- NVL (与PG的COALESCE类似)
SELECT NVL(NULL, 'Default Value') FROM dual;
-- 输出: Default Value

-- DECODE
SELECT DECODE(1, 1, 'One', 2, 'Two', 'Other') FROM dual;
-- 输出: One

-- INSTRB, SUBSTRB (字节定位)
SELECT INSTRB('IvorySQL数据库', 'SQL') FROM dual;
-- 输出: 5 (字节位置)

RowID 伪列

-- 开启ROWID功能
SET ivorysql.default_with_rowids TO on;

CREATE TABLE test_rowid (id INT, data TEXT);
INSERT INTO test_rowid VALUES (1, 'Row 1');

-- 查询ROWID
SELECT rowid, id, data FROM test_rowid;
-- 输出: 一个类似 '01000000' 的唯一标识符

4. 其他关键特性代码演示

Sequence 序列

CREATE SEQUENCE my_seq START WITH 1 INCREMENT BY 1;
SELECT my_seq.NEXTVAL FROM DUAL;
-- 输出: 1
SELECT my_seq.CURRVAL FROM DUAL;
-- 输出: 1

不可见列(INVISIBLE COLUMN)

CREATE TABLE employee (
    emp_id INT PRIMARY KEY,
    emp_name TEXT,
    salary DECIMAL(10,2) INVISIBLE  -- 对旧查询透明
);

INSERT INTO employee (emp_id, emp_name, salary) VALUES (1, 'Alice', 10000);
SELECT * FROM employee;
-- 只显示 emp_id, emp_name

% TYPE 和 % ROWTYPE 属性

CREATE TABLE users (id INT, name VARCHAR2(100));

CREATE OR REPLACE FUNCTION get_user_info(p_id users.id%TYPE) RETURN users.name%TYPE IS
    v_name users.name%TYPE;
BEGIN
    SELECT name INTO v_name FROM users WHERE id = p_id;
    RETURN v_name;
END;

CALL INTO 子句

VARIABLE v_result VARCHAR2(100);
CALL my_func() INTO :v_result;
PRINT v_result;

5. 标识符大小写转换

IvorySQL 通过 identifier_case_switch 参数提供三种转换模式,解决 Oracle 与 PG 标识符大小写差异问题:

  • normal:保持双引号标识符大小写不变
  • interchange(默认):全大写转小写,全小写转大写,适配 Oracle 与 PG 的大小写规则
  • lowercase:全大写转小写,大小写混合保持不变
SET ivorysql.identifier_case_switch = interchange;
CREATE TABLE "EMPLOYEE_TABLE" (id INT);  -- Oracle风格大写
-- 实际创建表名为 employee_table,符合PG习惯

安装部署:从单机到云原生的全景图

IvorySQL 安装方式丰富,覆盖开发、测试、生产全场景。

1. 快速起步:Yum 一键安装

配置 yum 源

sudo tee /etc/yum.repos.d/ivorysql.repo <<EOF
[ivorysql5]
name=IvorySQL Server 5 $releasever - $basearch
baseurl=https://yum.highgo.com/dists/ivorysql-rpms/5/redhat/rhel-$releasever-$basearch
enabled=1
gpgcheck=0
EOF

安装

sudo dnf install -y ivorysql5-5.3

配置环境变量

echo 'PATH=/usr/ivory-5/bin:$PATH' >> ~/.bash_profile
echo 'PGDATA=/usr/ivory-5/data' >> ~/.bash_profile
source ~/.bash_profile

初始化并启动

initdb -D $PGDATA
pg_ctl -D $PGDATA -l logfile start

2. Docker 部署

快速搭建开发、测试环境:

拉取镜像

docker pull ivorysql/ivorysql:5.3-ubi8

运行容器,同时暴露 PG 端口(5432)和 Oracle 端口(1521)

docker run --name ivorysql \
  -p 5432:5432 \
  -p 1521:1521 \
  -e IVORYSQL_PASSWORD=mysecretpassword \
  -d ivorysql/ivorysql:5.3-ubi8

通过 PG 端口连接

psql -h 127.0.0.1 -p 5432 -U ivorysql -d ivorysql

通过 Oracle 端口连接(默认 Oracle 兼容模式)

psql -h 127.0.0.1 -p 1521 -U ivorysql -d ivorysql

关键点:容器默认同时监听 5432(PG 模式)和 1521(Oracle 模式)双端口,可按需切换。

3. K8s/Harbor Operator 云原生部署

生产环境可使用 IvorySQL Operator,基于 Kubernetes 实现高可用、备份、监控自动化:

apiVersion: ivory-operator.ivorysql.org/v1beta1
kind: IvoryCluster
metadata:
  name: hippo
spec:
  image: ivorysql/ivorysql:5.3-ubi8
  postgresVersion: 18
  instances:
    - name: instance1
      replicas: 2  # 高可用副本
      dataVolumeClaimSpec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi
  backups:
    pgbackrest:
      image: ivorysql/pgbackrest:ubi8-2.56.0-5.0-1
      repos:
      - name: repo1
        volume:
          volumeClaimSpec:
            accessModes: ["ReadWriteOnce"]
            resources:
              requests:
                storage: 1Gi
  patroni:
    dynamicConfiguration:
      synchronous_mode: true  # 开启同步复制

执行部署命令:

kubectl apply -k examples/kustomize/ivory Operator 自动完成 Pod、密钥、服务、证书、备份策略等配置,实现一键部署。

运维生态:让管理更简单,让性能更卓越

高可用集群搭建,基于流复制搭建主备集群:

主库 postgresql.conf

listen_addresses = '*'
wal_level = replica
max_wal_senders = 5
hot_standby = on

备库初始化

pg_basebackup -F p -P -X fetch -R -h <master_ip> -p <master_port> -U republic_user -D $PGDATA

性能监控与 SQL 分析

结合 pgMonitor + Grafana 搭建监控大屏,同时提供常用诊断 SQL:

-- 查看执行计划
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM large_table WHERE id = 100;

-- 查看当前活跃会话
SELECT pid, state, query, wait_event_type FROM pg_stat_activity WHERE state = 'active';

-- 诊断锁冲突
SELECT blocked_locks.pid AS blocked_pid,
       blocked_activity.query AS blocked_query,
       blocking_locks.pid AS blocking_pid,
       blocking_activity.query AS blocking_query
FROM pg_locks blocked_locks
JOIN pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype
                           AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database
                           AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
                           AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
                           AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
                           AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
                           AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
                           AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
                           AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
                           AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
                           AND blocking_locks.pid != blocked_locks.pid
JOIN pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;

数据迁移

使用 pg_dump 完成同架构数据迁移:

pg_dump -h old_oracle_compatible_server -U old_user old_db | psql -h new_ivorysql_server -U new_user new_db

结论:面向未来的数据基础设施

IvorySQL 不仅仅是一个基于 PostgreSQL 的再发行版,它是一个思考深、设计巧、价值高的开源数据库项目。它成功地解决了 Oracle 用户向开源和云原生生态迁移的核心障碍 —— 兼容性。

对于希望摆脱 Oracle 高昂许可束缚、拥抱 PostgreSQL 开放生态的企业,IvorySQL 提供了一条近乎完美的平滑过渡方案。它不仅降低了迁移的门槛和风险,更重要的是,它将 Oracle 的强大与 PostgreSQL 的灵活结合在了一起,为用户在未来的数据结构、混合多模态数据处理上提供了无限的想象空间。

IvorySQL 的出现,标志着数据库领域 “融合” 趋势的进一步发展。它不是去颠覆谁,而是在做一件更有意义的事:让历史与未来,在一个高效、可靠的平台上共存共生。 对于任何正在规划数据库现代化或面临迁移决策的组织而言,深入研究并积极探索 IvorySQL,无疑是一个极具前瞻性和战略价值的明智之举。

作者:杨宇,PG ACE,第八届 PG 数据库生态大会 2025 年度金牌讲师,PG 分会哈尔滨用户组核心成员,负责本公司数据库、云计算等相关运维工作。

曾主持对公司 PostgreSQL 数据库进行架构设计、容灾系统搭建及报表优化工作。闲暇之余致力于 PostgreSQL 数据库的传播,发表多篇架构、优化相关的原创文章。目前拥有 ORACLE 11G/12C OCM、MYSQL 5.7/8.0 OCP、TIDB PCTP、OBCP V4、电科金仓 KCP 等资质认证。

手把手教你使用HFSS仿真高速差分过孔—上 高速数字电路设计中,信号完整性是一个非常重要的问题。为了使信号保持良好的传输特性,PCB板上的互联线一般都采用均匀传输线,使互联线保持特性阻抗一致性,减少信号反射。然而PCB板上的互联线很多时候避免不了换层的问题,这时候就必须使用过孔。过孔会导致阻抗不连续,进而造成反射,出现信号完整性问题。         当信号传输速率越高,信号前沿越短的时候,过孔引入的信号完整性问题越严重,需要对过孔进行优 阅读详情

相关推荐

SystemRDL:从寄存器描述到自动化生成的完整指南

本文详细介绍了SystemRDL如何通过“一份描述,多处生成”的理念,彻底解决芯片与FPGA设计中手动维护寄存器带来的不一致与低效问题。文章提供了从语言快速上手、核心组件讲解到使用PeakRDL工具链实现自动化代码与文档生成的完整实战指南,帮助硬件工程师构建高效、可靠的寄存器开发流程。

weixin_29243279的博客 664

「2024 年度技术精华盘点」IvorySQL & PostgreSQL 技术干货全解析!

2024 年,IvorySQL 持续输出高质量技术内容,涵盖 PostgreSQL 核心技术解析 和 IvorySQL 创新实践 两大方向。无论您是数据库领域的初学者,还是经验丰富的开发者,这些干货文章都能为您带来新的启发与实用价值。现在,让我们一起回顾这些精彩内容,探索数据库技术的无限可能!

IvorySQL的博客 661

【verilog语法详解:从入门到精通】

Verilog语法详解:从入门到精通 摘要:本文系统讲解Verilog硬件描述语言的核心语法与应用。Verilog作为数字电路设计标准,具有并行执行、硬件映射和层次化三大特点。文章从基础语法框架入手,详细介绍了模块定义、端口类型(input/output/inout)声明规范,以及线网型(wire)和寄存器型(reg)两种核心数据类型的区别与应用场景。重点讲解了组合逻辑(assign连续赋值)和时序逻辑(always块)的实现方式,包括阻塞赋值(=)与非阻塞赋值(<=)的关键差异。此外,还涵盖了参数(

m0_58476824的博客 4687

IvorySQL 3.2 贡献独门秘籍,可以平滑迁移Oracle???

这样的设计使得当IvorySQL遇到updatexml函数调用时,能够调用相应的c函数来处理,从而实现了对Oracle中updatexml函数的兼容。它是一种轻便的,可扩展的,标准的且简学易懂的保存数据的语言。由于UPDATEXML函数的参数数量是不确定的,因此采用了表达式方式来实现,这要求为其编写专门的语法分析代码和执行器代码,以确保其功能的正确性和灵活性。这些XML函数作为ivorysql_ora插件的一个子插件提供,确保了与PostgreSQL数据库在XML处理方面的兼容性和一致性。

IvorySQL的博客 1198

SpringCloud2025+SpringBoot3.5.0动态路由503问题排查与负载均衡依赖解析

本文详细排查了SpringCloud 2025与SpringBoot 3.5.0环境下,Spring Cloud Gateway动态路由返回503错误的根本原因。核心问题在于新版网关未默认集成负载均衡器,导致无法解析lb://服务名。通过对比静态路由与动态路由,定位到需显式引入spring-cloud-starter-loadbalancer依赖,并提供了完整的解决方案与最佳实践配置。

s3t4u的博客 504

IFRS 9与CECL对比解析:跨国企业财务必须掌握的两种信用损失模型

本文深度解析IFRS 9与CECL两种信用损失模型的差异,帮助跨国企业应对财务合规挑战。从基础架构、数据治理到监管策略,详细对比三阶段模型与单一阶段模型的核心区别,并提供实施双轨制的实务建议,助力企业优化资本管理和税务筹划。

3c4x5z6v7b的博客 670

IvorySQL3.0:基于PG16.0最新内核,实现兼容Oracle数据库再升级

IvorySQL3.0是瀚高股份的核心研发团队在深入研究和掌握PostgreSQL16.0最新内核的基础上,融合公司多年对Oracle数据库兼容特性研发及运维管理的经验,为用户精心打造的一款专为核心OLTP业务而设计的开源关系型数据库。这些项目的推出将大大扩展IvorySQL的应用范围,并为用户提供更加便捷、高效和灵活的数据库服务。针对这些挑战,IvorySQL提供了一种解决方案,以全球最先进的开源数据库PostgreSQL为基础,最大限度兼容Oracle,提供更好的数据库迁移服务。

IvorySQL的博客 547

从零部署Stable Diffusion:本地环境搭建完整教程

本文专为“想自己跑Stable Diffusion但完全没经验”的新手设计,覆盖从硬件准备到生成第一张图的完整流程。不涉及复杂算法原理,但会讲清每个操作的“为什么”(比如为什么需要显卡?为什么要装CUDA?),帮你知其然更知其所以然。先检查硬件是否达标(显卡是核心!安装必要软件(操作系统、Python、CUDA)下载Stable Diffusion核心代码和模型解决常见报错,生成第一张图附赠模型库推荐和性能优化技巧显卡是核心:N卡+足够显存(至少6G)是本地部署的基础。CUDA是翻译。

AI算力网络与通信的博客 1294

IvorySQL:兼容Oracle数据库的开源PostgreSQL

今天给大家介绍一款基于 PostgreSQL 开发、兼容 Oracle 数据库的国产开源关系型数据库管理系统:IvorySQL。

Tony.Dong的专栏 1169

C#与海康威视工业相机结合OpenCV与WPF:打造高效的机器视觉应用程序

本文介绍了基于C#、海康威视工业相机SDK和OpenCV的机器视觉应用开发方法。首先配置开发环境,包括海康SDK、OpenCvSharp和WPF项目设置。重点阐述了如何通过SDK初始化相机、获取视频流,并将YUV数据转换为OpenCV可处理的Mat格式进行图像处理(如边缘检测)。同时展示了如何用WPF实现界面交互和实时图像显示。该方案为工业自动化、质量检测等场景提供了高效的技术实现路径,结合了海康相机的高性能采集、OpenCV的强大算法和WPF的交互优势,具有较高的实用价值。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1499

Java全栈:电影数据检索与推荐系统实战

全文检索个性化推荐数据缓存容器化部署通过这个项目,我们不仅实践了Java全栈开发的各项技术,还接触了推荐系统的核心算法实现。用户历史行为数据物品特征数据上下文信息实时反馈算法的准确性推荐的多样性系统的实时性冷启动问题性能优化效果评估VIEW, // 浏览CLICK, // 点击SEARCH, // 搜索RATE, // 评分COMMENT, // 评论SHARE, // 分享WATCH_TIME, // 观看时长。

exlink2012的专栏 892

IvorySQL: 开源世界里的Oracle兼容之王

在数据库领域,选择一款既强大又具备广泛兼容性的解决方案实属不易。而今天,我们将要推荐的IvorySQL,正是这样一位集大成者,它不仅拥有PostgreSQL的强大功能,还实现了对Oracle的高度兼容,成为众多企业和开发者的新宠。 ## 项目介绍 IvorySQL是一款先进的开源数据库系统,它致力于提供一个既与最新版本PostgreSQL完全兼容,又支持Oracle语法和特性的全方位解决方案。...

gitblog_00801的博客 978

ubuntu emto-cpa安装与编译

ubuntu emto-cpa安装与编译

qq_45834835的博客 1436

PostgreSQL数据库技术峰会北京站活动回顾|IvorySQL 双解析器架构下的兼容性创新实践

2025年4月22日,由中国开源软件推进联盟PG分会主办,PostgreSQL ACE/PG分会北京&天津用户组负责人刘华阳联合发起的“PostgreSQL数据库技术峰会北京站”落幕。本次活动以“PG与AI融合”为主题,结合当下AI大模型应用、国产化趋势,邀请社群技术专家围绕产品特性、应用案例、运维经验、技术演进、行业方向等进行分享,推动PostgreSQL在中国的发展。

IvorySQL的博客 731

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

手把手教你在 openKylin 上部署 IvorySQL 4.4

本文探讨了如何在基于 Debian 的 openKylin 操作系统上安装 IvorySQL 4.4 数据库的全过程。对 IvorySQL 4.4 版本的更新亮点加以详细介绍、演示。此外,IvorySQL 在线聊天室的上线,为用户在使用过程中提供了便捷的技术支持和交流平台,进一步提升了用户体验和工作效率。

IvorySQL的博客 887

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

两个月了,第一批IvorySQL布道者已出炉!

6 月末,IvorySQL 社区正式发起了。我们初衷很简单:不搞硬核门槛、不用全职投入,给所有热爱开源、喜欢折腾技术的小伙伴,一个业余参与社区、展示自己、收获专属福利的平台。该计划发布后,立刻吸引了三十多位小伙伴参与。转眼两个月过去了,成果如何呢?先公布结果:已经有 12 位小伙伴达到了 100 积分,迈过了布道者门槛,成为 IvorySQL 第一批官方认证布道者!他们分别是:尚雷,尹海文,杨向博,德哥,杨宇,付超,张晨,葛云杰,魏波,严少安,崔鹏,马顺华。

IvorySQL的博客 172

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ivorysql 源码分析-双port兼容

ivorysql采用双端口的方式实现oracle兼容,默认的5432端口为pg语法,1532用来支持oracle的语法与功能,从官方的流程图上看是支持oracle应用连接的,但是貌似没有支持oracle的协议,以下为支持oracle兼容模式的提交的commit。生成不同语法解析函数:%name-prefix=“base_yy” 代表生成的函数和变量名从yy改成base_yy,同flex,为了在一个产品里使用多个语法分析器,分析不同的数据类。​ 原文件基本复制的plpgsql,做了部分文件名等修改。

weixin_41685257的博客 960

白鳝:聊聊IvorySQL的Oracle兼容技术细节与实现原理

PG与Oracle在数据类型方面存在一定的差异,因此要拉平两种模式的数据类型,还是需要一个比较适当的策略的,并不是直接做成兼容就可以的,因为精度和访问特点还是有很大的差异的,在双模式下,如果强行拉平可能会引入很多BUG,我猜测这可能是当前IvorySQL采用此种策略的原因。匿名块在Oracle应用里还是有着广泛的应用的,我们的D-SMART在做数据库指标采集的时候,对于支持匿名块的数据库,优先使用匿名块的方式,这样可以减少RDBMS SERVER与客户端的网络交互,提高应用的效率。

IvorySQL的博客 834

深度拆解 IvorySQL 去 O 核心解决方案

本文整理于 HOW 2026 矫顺田演讲内容。

IvorySQL的博客 362

fast-lio2复现跑avia数据集

本文详细介绍了在Windows WSL2中安装Ubuntu 22.04并配置ROS2 Humble环境的全过程,涵盖系统初始化、ROS2安装、Livox雷达驱动编译及FAST-LIO2 ROS2版本的构建与验证。通过完整数据集回放与建图测试,成功实现点云地图生成与轨迹记录,并利用evo工具完成轨迹分析与可视化。最终输出包括累积点云地图、位姿轨迹及实验配置文件,为后续精度评估与复现提供基准。

chase_my_dream的博客 369

linux学习

sudo make install:组装好的家具(编译好的库文件),原本放在你的临时工作区。坏处是,你的程序体积会变大。于是,他会根据你的计划书,结合你电脑的当前情况(比如装了什么编译器,库在哪),生成一本极度详细的《施工进度表》。很多大牌的第三方库(比如你刚装的 libevent)为了照顾不同的需求,会同时提供动态库(.so)和静态库(.a),但并不是所有库都这样。只有动态库:常见于系统的核心库(比如你系统的底层 C 库),或者一些商业闭源软件(厂商只给你一个黑盒子,不让你直接把代码打包进你的程序)。

d_mail的博客 194

ubuntu 偶发启动失败问题分析

ubuntu 系统启动偶发异常问题分析

平面到立体 193

MySQL系统篇,库的操作(三):建库、字符集校验规则与备份恢复

本文系统讲解MySQL数据库创建与管理,聚焦字符集(CHARACTER SET)与校验规则(COLLATE)的核心作用:前者决定字符存储范围,后者影响比较与排序逻辑。通过对比utf8_general_ci(不区分大小写)与utf8_bin(二进制比较)的实测差异,揭示其对查询结果和排序顺序的显著影响。文章还详解CREATE DATABASE语法、IF NOT EXISTS防错机制、命名规范及跨版本兼容性问题,并强调新项目应优先使用utf8mb4以支持完整Unicode。最后提供SHOW CREATE DAT

dasdasfv的博客 316

Spring 事务详解:@Transactional 如何生效、何时回滚、传播行为怎么选

从订单与库存写入出发,拆解 @Transactional 的代理调用链、默认回滚规则与自调用问题;通过 Spring Boot + H2 的五个验证用例比较 REQUIRED、REQUIRES_NEW、NESTED,并说明数据库事务与 Redis、消息和远程接口的边界。

qq_74421990的博客 332

Oracle多租户集群PDB异机恢复至单机部署数据库

本文详细演示了将Oracle RAC集群中的PDB(RMAN_PDB)通过RMAN备份恢复至单机CDB的全过程。首先在源库创建测试PDB并插入数据,随后配置RMAN备份路径,备份该PDB及其元数据文件。接着将备份文件传输至单机环境,启动实例并恢复控制文件与数据文件,最后利用DBMS_PDB.EXPOSE_PDB_FROM_RMAN生成PDB描述文件,将其插入新单机CDB中,实现PDB的独立使用。整个流程涵盖数据准备、备份、恢复及插入,完整验证了跨环境PDB迁移的可行性。

qq_57492774的博客 201

IvorySQL 是怎么把 Oracle 兼容塞进 PostgreSQL 内核的

IvorySQL 以“不重写内核、紧跟 PG 上游”为路径,通过会话级 compatible_mode 实现 Oracle 与 PostgreSQL 方言共存,依托独立解析器和 PL/iSQL 支持存储过程、包、隐式转换等核心特性,兼容性覆盖语法、数据类型、系统视图及扩展生态。其双测试框架保障与上游同步,避免兼容层拖累原生功能。相比 openGauss 等深度改造方案,IvorySQL 更适合存量 PL/SQL 多、欲保生态、追求开源与可迁移性的场景,是 Oracle 迁移中兼具可行性与前瞻性的选择。

u011436548的专栏 244
上一篇: PG 日报|PG 排序性能优化,新增 UUID 聚合函数
下一篇: PG 日报|UUID 解析 SIMD 加速,AI 行业动态速览
IvorySQL
博客等级 码龄5年 745粉丝 565原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值