清除过滤器
文章
Qiao Peng · 三月 29, 2021
Caché Shadow
上次介绍了使用InterSystems IRIS/Caché的Reporting类型的异步镜像成员获取数据变更。但早期的Caché并不支持镜像,例如Caché 2008,它只支持Shadow。
在这些早期版本上是否也可以实利用Journal实现类似CDC的功能呢?答案是肯定的,就是利用Shadow服务器的Dejournaling filter routine (Dejournaling过滤器routine)。
Dejournaling filter routine
InterSystems Caché的 Dejournaling过滤器routine是一个用户自定义的routine,用于在Shadow服务器上过滤Journal记录。当配置了Dejournaling 过滤器后,Shadow服务器在redo journal前会自动调用Dejournaling过滤器routine。该routine传入参数以下:
pid:记录进程ID;
dir:源数据库目录;
glo:Global节点(包括下标);
type: 操作类型,为S (Set)、K (Kill)、s (BITSET)、k (ZKILL);
addr:Journal记录在Journal文件中的偏移量;
time:记录的时间戳。
该Routine返回1,说明此journal记录需要被Shadow恢复,而返回0说明此journal记录不需要被Shadow恢复。
因为这是一个自定义routine,且会被Shadow服务器恢复Journal时自动调用,因此我们可以利用它记录数据变更。
注意:
Shadow配置不在本文内容里,请参考文档: [Caché] https://cedocs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GCDI_shadow
编写Dejournaling filter routine
Routine的名字可以任意,但这个routine需要保存在Caché Shadow服务器的%SYS下。
例如,将global的数据变更记录在^CDCLog中:
MyShadowFilter(pid,dir,glo,type,addr,time)
{
Set ^CDCLog($I(^CDCLog))=$lb(dir,glo,type,addr)
Quit 1
}
配置Dejournaling filter routine
在 Caché Shadow服务器的系统管理门户的[Home] > [Configuration] > [Shadow Server Settings] 上选择已经建立好的Shadow服务器,选择高级(Advanced)设置,在Filter routine里填写上面创建的routine名称即可。
CDC系列
更多的CDC选项实现,请参考:
1. CDC系列之一 :使用Dejournal Filter在InterSystems IRIS/Caché上通过Mirroring实现CDC功能
2. CDC系列之二 :使用Dejournaling filter routine在Caché上通过Shadow实现CDC
3. CDC系列之三 :建立InterSystems IRIS/Caché的Global数据变更与SQL表记录的对应关系
4. CDC系列之四:使用DSTIME特性在InterSystems IRIS/Caché上实现CDC功能
文章
Michael Lei · 一月 27, 2022
欢迎到我们Global Master 网站完成冬奥小游戏,赢积分,抽奖品(雨伞/保温杯/T-Shirt)。
https://globalmasters.intersystems.com/channels/72
不知道如何玩转Global Master, 请参考:认识Global Masters 倡导中心,从这里开始! | InterSystems Developer Community | Global
文章
Hao Ma · 四月 19, 2022
本文档只是给您一个大致的概念,方便您了解IRIS安装的方方面面。并非官方安装手册或者安装建议。生产环境的安装请仔细研究并参照[IRIS官方的安装文档](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=AB_install#AB_install_Linux)
### 操作系统的选择
IRIS支持多种Linux系统。详细的列表请参见各个版本的支持列表,比如这个是最新的[2021IRIS的支持列表](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=ISP_technologies#ISP_platforms_server)。需要注意的是, CentOS只支持作为测试系统, 并不支持生产系统的安装。
官方文档是以Redhat为主介绍的IRIS安装, 这是IRIS在生产环境中最常用的Linux系统之一。另一个Ubantu, InterSystems提供的docker版本是安装在Ubantu上的。
我自己测试的时候喜欢使用CentOS, 所以后面有具体安装步骤中,使用的CentOS上的记录。
### 服务器的配置
对于生产系统,安装前需要一个硬件配置方案,这个方案通常是您的项目的实施部门根据用户需求提供的。
对于测试系统,只有一个最小的磁盘的要求:1.5G。无论是实体服务器, 虚拟服务器,或者docker container,根据您要测试的内容, 一切以方便为准。如果不做性能测试,我个人经常使用的CentOS虚拟机是2核CPU, 2G或4G内存,没有运行不流畅的问题。
### 磁盘分区
标准的Linux磁盘分区并不适合IRIS的生产运行。哪怕要创建一个尽量接近生产的测试环境,建议您安装软件前要有一个完整的磁盘分区规划。在官方文档中,创建IRIS服务器分区有以下原则:
1. **IRIS程序,客户的数据库,首选Journal,备选Journal应该是分开标准分区或者逻辑盘存储的。所以至少要4个分区/逻辑盘**。
您也可能会喜欢再给backup文件和其他的比如IRIS使用的web文件添加更多的逻辑盘。
2. 文件系统方面,IRIS程序,客户的数据库推荐使用xfs文件格式,**journal盘推荐ext4格式**。( 经过专家确认,这个推荐不属于强烈推荐,更不是强制要求。大多数情况下使用xfs格式没问题。只是在大项目中,比如当您的Journal盘需要分配1TB的空间,特别是使用ECP服务器的情况下, ext4会因为更低的延时带来相对好的性能表现)
以下是一个测试系统中的分区配置,仅仅是示意。
```sh
[root@MyCentOS7 ~]# cat /etc/fstab
/dev/mapper/centos_hmscentos7-root / xfs defaults 0 0
UUID=1d1b46a2-d66d-4346-8709-e70854088b11 /boot xfs defaults 0 0
/dev/mapper/vg_iris-isc_data /isc/data xfs defaults 0 0
/dev/mapper/vg_iris-isc_iris /isc/iris xfs defaults 0 0
UUID=c9ce6576-b469-4c74-8867-fe5b5060ad62 /isc/j1 ext4 defaults 1 2
UUID=0be8a20a-b76c-4a17-9018-ecea1964b73b /isc/j2 ext4 defaults 1 2
/dev/mapper/centos_hmscentos7-swap swap swap defaults 0 0
[root@hmsCentOS7 ~]#
```
这是一个生产环境的配置实例, 其中/isc/iris是iris安装路径:下面放系统的文件,系统使用的数据库,以及和系统工作相关的文件等等,通常分配100-200G。其他的逻辑盘按客户需要分配。SWAP, /boot, /home, /var等等的配置按Linux的推荐及客户的方案配置。
| **Mount Point** | **VG** | **LV** | Size | **File System** | **Mount Options** |
| :-------------- | :------ | :-------- | :--- | --------------- | :---------------- |
| /isc/iris | vg_iris | lv_iris | 200G | XFS | 默认, nobarrier |
| /isc/db | vg_iris | lv_irisdb | 1TB | XFS | 默认, nobarrier |
| /isc/jrnpri | | | 500G | EXT4 | 默认 |
| /isc/jrnsec | | | 500G | EXT4 | 默认 |
在上面的方案中, iris系统自带的数据库IRISTEMP是放在/isc/iris下的。 IRISTEMP正常情况下不会很大,但如果应用的设计很特别,或者出了什么问题,分配了200G大小的/isc/iris可能不足够。如果生产环境发现IRISTEMP有过大的风险,您可能需要单独给IRISTEMP分配一个逻辑盘。
###优化服务器内存配置
以下的对服务器内存的设置可以提高IRIS的性能。
**使用HugePage内存**
IRIS会自动使用系统配置的HugePage, 这会提高IRIS的内存使用效率。在线文档有这么一句: **在超大页内存中可用的内存数量应大于待分配的共享内存总数;否则,将不会使用超大页内存**。 因为 内存数据的总数是为Global, Routine, Lock等分配的内存的和。可以简单的从IRIS启动的日志message.log里看到。
比如下面IRIS被分配了8913M的总内存:
```sh
12/24/21-16:28:58:490 (14080) 0 [Generic.Event] Allocated 8913MB shared memory: 8003MB global buffers, 300MB routine buffers
```
另外,因为操作系统自身的进程不会使用HugePage内存, 您也不能把内存都设置成HugePage。所以设置为**比IRIS需要的多一点就好**。
我们来看看配置HugePage的一个简单例子
```bash
# 查看服务器物理内存
[root@hmsCentOS7 ~]# cat /proc/meminfo | grep MemTotal
MemTotal: 995676 kB
#查看HugePage配置
[root@hmsCentOS7 ~]# cat /proc/meminfo | grep Huge
AnonHugePages: 67584 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
# 修改配置,分配256个2M的HugePage
[root@hmsCentOS7 ~]# vi /etc/sysctl.conf
[root@hmsCentOS7 ~]# cat /etc/sysctl.conf | grep -v ^#
vm.nr_hugepages=256
#load新配置
[root@hmsCentOS7 ~]# sysctl -p
vm.nr_hugepages = 256
[root@hmsCentOS7 ~]
[root@hmsCentOS7 ~]# cat /proc/meminfo | grep Huge
AnonHugePages: 6144 kB
HugePages_Total: 256
HugePages_Free: 256
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
[root@hmsCentOS7 ~]#
```
如果此时您启动IRIS, 会出现“Allocated xxxxMB shared memory using Huge Pages"的日志记录,而且能在/proc/meminfo里看到HugePage的占用情况。
**禁用THP(Transparent Huge Pages)**
InterSystems建议在IRIS服务器禁用THP。RedHat或者CentOS是默认打开的:
```SH
[root@hmsCentOS7 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
[root@hmsCentOS7 ~]#
```
禁用THP您需要修改/etc/default/grub中的GRUB_CMDLINE_LINUX记录,添加“transparent_hugepage=never“
```sh
# 修改文件
[root@hmsCentOS7 ~]# cat /etc/default/grub | grep GRUB_CMDLINE
GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos_hmscentos7/root rd.lvm.lv=centos_hmscentos7/swap rhgb quiet transparent_hugepage=never"
# regenerate grub2配置
[root@hmsCentOS7 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-1160.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-bd06ad08438443f5a959cb7c0c264e89
Found initrd image: /boot/initramfs-0-rescue-bd06ad08438443f5a959cb7c0c264e89.img
done
#重启
[root@hmsCentOS7 ~]shutdown -r now
# 确认配置成功
[root@hmsCentOS7 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[root@hmsCentOS7 ~]#
```
> [Redhat文档:配置THP](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/performance_tuning_guide/sect-red_hat_enterprise_linux-performance_tuning_guide-configuring_transparent_huge_pages)
**Dirty Page Cleanup**
在一个大内存(比如大于8G)的Linux系统中,以下参数的修改会提高大量flat-files的写性能,比如大量的文件拷贝或者IRIS backup。
- dirty-background_ratio: InterSystems建议设置为5
- dirty_ratio: InterSystems建议设置为10
您需要修改/etc/sysctl.conf文件, 添加这两行:
```sh
vm.dirty_background_ratio=5
vm.dirty_ratio=10
```
###配置NTP服务
各个数据库服务直接以及数据库服务器和应用服务,Web服务,打印服务等等之间要求精准的时间同步。客户可以自己选择采用chornyd或者ntpd来配置NTP。而且, 每个IRIS服务器推荐配置至少2个NTP Server地址。
有关配置NTP的方法请参考相关文档。
比如:[Redhat文档: CONFIGURING NTP USING THE CHRONY SUITE](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-configuring_ntp_using_the_chrony_suite#sect-differences_between_ntpd_and_chronyd)
### 安装Web Server (optional)
IRIS提供Web服务需要单独安装的Web服务器。在Linux系统,IRIS支持Apache Web Server和Nginx。
生产环境中, 推荐将Web Server和IRIS安装在不同的硬件服务器上。但是, **如果是要将Web服务器和IRIS安装在同一台服务器,那么最好最好先装好Web Server, 再安装IRIS。**
在执行IRIS的安装脚本时,会提示用户是否需要连接那么先装Apache Web Server和Nginx是正确的顺序, 这样安装IRIS的时候可以将IRIS的Web服务组件,IRIS_WebGateway安装到Apache Web Server的安装目录,并生成相应的配置文件。
```sh
# 修改httpd状态的常用命令
systemctl start httpd.service #启动apache
systemctl stop httpd.service #停止apache
systemctl restart httpd.service #重启apache
#设置开机启动
sudo systemctl enable httpd.service #设置开机启动
```
> 如果启动httpd显示错误“httpd: Could not reliably determine the server's fully qualified domain name”,您需要修改httpd.conf文件, 添加ServerName, 比如设为ServerName localhost:80
**到这里, 您已经基本完成了安装IRIS的准备工作,下面是IRIS的安装步骤。**
### 加载IRIS安装软件
```sh
# 解压安装文件
[root@hmsCentOS7 ~]# mkdir /tmp/iriskit
[root@hmsCentOS7 ~]# chmod og+rx /tmp/iriskit
[root@hmsCentOS7 ~]# umask 022
[root@hmsCentOS7 ~]# gunzip -c IRIS-2022.1.0.140.0-lnxrh7x64.tar.gz | (cd /tmp/iriskit; tar xf -)
[root@hmsCentOS7 iriskit]# cd /tmp/iriskit/IRIS-2022.1.0.140.0-lnxrh7x64/
[root@hmsCentOS7 IRIS-2022.1.0.140.0-lnxrh7x64]# ls
LICENSE NOTICE cplatname dist docs irisinstall irisinstall_client irisinstall_silent kitlist lgpl.txt package tools
```
> tar -zxvf *.tar.gz是centos上常用的解压命令。上面使用的gunzip来着文档,据说是更通用,适合无法用tar来操作.gz文件的linux系统环境。
###安装依赖的软件包
建议执行IRIS安装脚本前先检查需要的软件包。
```sh
# 查看安装需要的软件包
[root@hmsCentOS7 IRIS-2022.1.0.140.0-lnxrh7x64]# ./irisinstall --prechecker
Your system type is 'Red Hat Enterprise Linux (x64)'.
Checking Requirements ...
Requirement for openssl version 1.0.2 is satisfied.
Requirement for zlib version 1.2.7 is satisfied.
[root@hmsCentOS7 IRIS-2022.1.0.140.0-lnxrh7x64]#
```
除此以外,以下软件包是按情况可选的:
- snmpd: 如果您需要使用SNMP来监控IRIS
- jre或者jdk : 如果您需要IRIS服务器使用JDBC连接其他数据库
- unixODBC: 如果您需要IRIS服务器使用ODBC连接其他数据库
- policycoreutils-python, policycoreutils-devel, settroubleshoot-server : 如果您需要使用SELinux管理IRIS文件的读写。
它们只是IRIS工作时需要的软件包,IRIS的安装并不依赖或者检查它们。
###创建iris用户
安装iris需要root用户或者拥有root权限的sudoer。然而,按照Linux的常规做法,出于安全的考虑,IRIS的管理和运行应该拥有自己的用户和用户组。在安装过程中, 您会被要求提供以下的内容:
- What user should be the owner of this instance?
- What group should be allowed to start and stop?
"owner of instance"和“group to start and stop"可以是一个用户和它的用户组。比如您创建了一个irisowner的用户, 它默认的用户组irisowner可以作为“group start to stop"。当然您也可以专门创建一个用户组, 比如irisadmin, 将您的管理员tom, jerry, mickey等等加入irisadmin。
在标准的安装步骤下, 用户组irisowner和用户组irisadmin权限相同, 因此最简单的方式就是使用irisowner用户和irisowner用户组。
```sh
# 创建iris owner
useradd irisowner
# 创建您的管理员团队
[root@hmsCentOS7 mail]# useradd -N tom
[root@hmsCentOS7 mail]# useradd -N jerry
[root@hmsCentOS7 mail]# useradd -N iscbackup
[root@hmsCentOS7 mail]# gpasswd irisowner -a tom
Adding user tom to group irisowner
[root@hmsCentOS7 mail]# gpasswd irisowner -a jerry
Adding user jerry to group irisowner
[root@hmsCentOS7 mail]# gpasswd irisowner -a iscbackup
Adding user iscbackup to group irisowner
[root@hmsCentOS7 mail]# cat /etc/group | grep irisowner
irisowner:x:1000:tom,jerry,iscbackup
[root@hmsCentOS7 mail]#
```
*如果需要,您可以把tom, jerry等用户加入sudoer列表。*
**实际上, 在后面安装脚本的执行过程中, 还有2个重要的用户被创建出来, 他们是:**
- **irisusr**: 所有iris进程使用这个user运行。它还用来访问数据库和journal。在一个安全的系统里,irisusr组里就只有一个用户irisusr, 也不要添加其他的user。
- **iscagent**: 用于运行镜像使用的iscagent进程
IRIS用户和管理员不要动这两个用户。
###执行IRIS安装脚本
安装脚本会设置user, group,和安装后文件的权限,您需要在按照前检查umask, 确认设置为022。
**执行标准的安装流程**
```bash
# 开始安装步骤
[root@hmsCentOS7 iriskit]# cd /tmp/iriskit/IRIS-2022.1.0.140.0-lnxrh7x64/
[root@hmsCentOS7 IRIS-2022.1.0.140.0-lnxrh7x64]# ls
LICENSE NOTICE cplatname dist docs irisinstall irisinstall_client irisinstall_silent kitlist lgpl.txt package tools
[root@hmsCentOS7 IRIS-2022.1.0.140.0-lnxrh7x64]# ./irisinstall
Your system type is 'Red Hat Enterprise Linux (x64)'.
Currently defined instances:
Enter instance name: iris
Do you want to create InterSystems IRIS instance 'iris' ?
Enter a destination directory for the new instance.
Directory: /isc/iris
------------------------------------------------------------------
NOTE: Users should not attempt to access InterSystems IRIS while
the installation is in progress.
------------------------------------------------------------------
Select installation type.
1) Development - Install InterSystems IRIS server and all language bindings
2) Server only - Install InterSystems IRIS server
3) Custom
Setup type ? 1
How restrictive do you want the initial Security settings to be?
"Minimal" is the least restrictive, "Locked Down" is the most secure.
1) Minimal
2) Normal
3) Locked Down
Initial Security settings ? 2
What user should be the owner of this instance? irisowner
An InterSystems IRIS account will also be created for user irisowner.
Install will create the following InterSystems IRIS accounts for you:
_SYSTEM, Admin, SuperUser, irisowner and CSPSystem.
Please enter the common password for _SYSTEM, Admin, SuperUser and irisowner:
Re-enter the password to confirm it:
Please enter the password for CSPSystem:
Re-enter the password to confirm it:
What group should be allowed to start and stop
this instance? irisowner
Do you want to install IRIS Unicode support ?
InterSystems IRIS did not detect a license key file
Do you want to enter a license key ?
Please review the installation options:
------------------------------------------------------------------
Instance name: iris
Destination directory: /isc/iris
InterSystems IRIS version to install: 2022.1.0.140.0
Installation type: Development
Unicode support: Y
Initial Security settings: Normal
User who owns instance: irisowner
Group allowed to start and stop instance: irisowner
Effective group for InterSystems IRIS processes: irisusr
Effective user for InterSystems IRIS SuperServer: irisusr
SuperServer port: 1972
WebServer port: 52773
JDBC Gateway port: 53773
Web Gateway: using built-in web server
Not installing IntegratedML
------------------------------------------------------------------
Confirm InterSystems IRIS installation ?
Starting installation
Starting up InterSystems IRIS for loading...
../bin/irisinstall -s . -B -c c -C /isc/iris/iris.cpf*iris -W 1 -g2
Starting Control Process
Allocated 238MB shared memory
32MB global buffers, 80MB routine buffers
Creating a WIJ file to hold 32 megabytes of data
IRIS startup successful.
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
System locale setting is 'en_US.UTF-8'
This copy of InterSystems IRIS has been licensed for use exclusively by:
Local license key file not found.
Copyright (c) 1986-2022 by InterSystems Corporation
Any other use is a violation of your license agreement
^^/isc/iris/mgr/>
^^/isc/iris/mgr/>
Start of IRIS initialization
Loading system routines
Updating system TEMP and LOCALDATA databases
Installing National Language support
Setting IRISTEMP default collation to IRIS standard (5)
Loading system classes
Updating Security database
Loading system source code
Building system indices
Updating Audit database
Updating Journal directory
Updating User database
Updating Interoperability databases
Scheduling inventory scan
IRIS initialization complete
See the iboot.log file for a record of the installation.
Starting up InterSystems IRIS...
Once this completes, users may access InterSystems IRIS
Starting IRIS
Using 'iris.cpf' configuration file
Starting Control Process
Global buffer setting requires attention. Auto-selected 25% of total memory.
Allocated 463MB shared memory
243MB global buffers, 80MB routine buffers
Creating a WIJ file to hold 99 megabytes of data
This copy of InterSystems IRIS has been licensed for use exclusively by:
Local license key file not found.
Copyright (c) 1986-2022 by InterSystems Corporation
Any other use is a violation of your license agreement
1 alert(s) during startup. See messages.log for details.
You can point your browser to http://hmsCentOS7:52773/csp/sys/UtilHome.csp
to access the management portal.
Installation completed successfully
[root@hmsCentOS7 IRIS-2022.1.0.140.0-lnxrh7x64]#
```
**执行customer安装IRIS+WebGateway**
如果要在本机安装WebGateway, 需要在执行安装脚本的过程中,当被问到:“Select installation type.”时选择Customer, 而不是Development。这样后面就脚本将在Web Server上加载IRIS专用的动态连接库,并创建和Web Server连接的IRIS Web网关。
在此之前, 您还需要配置安装semanage来保证可以配置SELinux。安装脚本会检查,如果没有发现semanag, 会提示您停止继续安装。
```sh
# 安装semanage, 确认命令可以工作。省略输出
[root@hmsCentOS7 ~]# yum install policycoreutils-devel
[root@hmsCentOS7 ~]# yum instll setroubleshoot-server
[root@hmsCentOS7 ~]# yum install setroubleshoot-server
[root@hmsCentOS7 ~]# semanage -h
...
[root@hmsCentOS7 ~]#
```
假设你已经创建了一个/isc/iris2的目录,然后就可以安装了。注意下面使用的superserver和web端口是51773和52774。这是默认的第2个IRIS实例的端口号,您也可以输入其他端口号或者在安装后在维护页面修改这些端口。
```sh
[root@hmsCentOS7 IRIS-2022.1.0.140.0-lnxrh7x64]# ./irisinstall
Your system type is 'Red Hat Enterprise Linux (x64)'.
Currently defined instances:
IRIS instance 'IRIS'
directory: /isc/iris
versionid: 2022.1.0.140.0
datadir: /isc/iris
conf file: iris.cpf (SuperServer port = 1972, WebServer = 52773)
status: down, last used Fri Apr 8 13:32:47 2022
product: InterSystems IRIS
Enter instance name: iris2
Do you want to create InterSystems IRIS instance 'iris2' ?
Enter a destination directory for the new instance.
Directory: /isc/iris2
------------------------------------------------------------------
NOTE: Users should not attempt to access InterSystems IRIS while
the installation is in progress.
------------------------------------------------------------------
Select installation type.
1) Development - Install InterSystems IRIS server and all language bindings
2) Server only - Install InterSystems IRIS server
3) Custom
Setup type ? 3
How restrictive do you want the initial Security settings to be?
"Minimal" is the least restrictive, "Locked Down" is the most secure.
1) Minimal
2) Normal
3) Locked Down
Initial Security settings ? 2
What user should be the owner of this instance? irisowner
An InterSystems IRIS account will also be created for user irisowner.
Install will create the following InterSystems IRIS accounts for you:
_SYSTEM, Admin, SuperUser, irisowner and CSPSystem.
Please enter the common password for _SYSTEM, Admin, SuperUser and irisowner:
Re-enter the password to confirm it:
Please enter the password for CSPSystem:
Re-enter the password to confirm it:
What group should be allowed to start and stop
this instance? irisowner
Do you want to configure additional security options ?
Do you want to install IRIS Unicode support ?
Enter the SuperServer port number :
Enter the WebServer port number :
Do you want to configure the Web Gateway to use an existing web server ? yes
Specify the WebServer type. Choose "None" if you want to configure
your WebServer manually.
1) Apache
2) None
WebServer type ? 1
Enter user name used by Apache server to run its worker processes :
Please enter location of Apache configuration file [/etc/httpd/conf/httpd.conf]:
// /etc/httpd/conf.d/isc.conf
Please enter location of Apache executable file :
Apache version 2.4 is detected.
Apache httpd server will be restarted during the install.
Please enter destination directory for Web Gateway files [/opt/webgateway]:
InterSystems IRIS did not detect a license key file
Do you want to enter a license key ?
Do you want to install IntegratedML (this feature requires additional 1166MB of disk space) ?
Please review the installation options:
------------------------------------------------------------------
Instance name: iris2
Destination directory: /isc/iris2
InterSystems IRIS version to install: 2022.1.0.140.0
Installation type: Custom
Unicode support: Y
Initial Security settings: Normal
User who owns instance: irisowner
Group allowed to start and stop instance: irisowner
Effective group for InterSystems IRIS processes: irisusr
Effective user for InterSystems IRIS SuperServer: irisusr
SuperServer port: 51773
WebServer port: 52774
JDBC Gateway port: 53773
Web Gateway: installed into /opt/webgateway
Apache web server will be configured for Web Gateway
Not installing IntegratedML
------------------------------------------------------------------
Confirm InterSystems IRIS installation ? yes
Starting installation
Updating Apache configuration file ...
- /etc/httpd/conf/httpd.conf
Starting up InterSystems IRIS for loading...
../bin/irisinstall -s . -B -c c -C /isc/iris2/iris.cpf*iris2 -W 1 -g2
Starting Control Process
Allocated 238MB shared memory
32MB global buffers, 80MB routine buffers
Creating a WIJ file to hold 32 megabytes of data
IRIS startup successful.
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
System locale setting is 'en_US.UTF-8'
This copy of InterSystems IRIS has been licensed for use exclusively by:
Local license key file not found.
Copyright (c) 1986-2022 by InterSystems Corporation
Any other use is a violation of your license agreement
^^/isc/iris2/mgr/>
^^/isc/iris2/mgr/>
Start of IRIS initialization
Loading system routines
Updating system TEMP and LOCALDATA databases
Installing National Language support
Setting IRISTEMP default collation to IRIS standard (5)
Loading system classes
Updating Security database
Loading system source code
Building system indices
Updating Audit database
Updating Journal directory
Updating User database
Updating Interoperability databases
Scheduling inventory scan
IRIS initialization complete
See the iboot.log file for a record of the installation.
Starting up InterSystems IRIS...
Once this completes, users may access InterSystems IRIS
Starting IRIS2
Using 'iris.cpf' configuration file
Starting Control Process
Global buffer setting requires attention. Auto-selected 25% of total memory.
Allocated 463MB shared memory
243MB global buffers, 80MB routine buffers
Creating a WIJ file to hold 99 megabytes of data
This copy of InterSystems IRIS has been licensed for use exclusively by:
Local license key file not found.
Copyright (c) 1986-2022 by InterSystems Corporation
Any other use is a violation of your license agreement
1 alert(s) during startup. See messages.log for details.
You can point your browser to http://hmsCentOS7:52774/csp/sys/UtilHome.csp
to access the management portal.
Installation completed successfully
[root@hmsCentOS7 IRIS-2022.1.0.140.0-lnxrh7x64]#
```
上面步骤中当提示:”Please enter location of Apache configuration file [/etc/httpd/conf/httpd.conf]: “ 的时候我使用了默认选项/etc/httpd/conf/httpd.conf, IRIS安装脚本回修改httpd.conf文件, 加入连接IRIS的配置。这里更好的做法是先在/etc/httpd/conf.d里创建一个单独的配置文件,比如isc.conf, 在回答上面的提示是输入**/etc/httpd/conf.d/isc.conf**。很遗憾您需要自己手工先创建这个文件,安装脚本不回替您创建。
### 安装后的检查
**检查安装日志**
查看上面的安装日志,确认没有错误发生。
**查看新创建的用户irisusr和iscagent**
```sh
[root@hmsCentOS7 ~]# id irisusr
uid=1001(irisusr) gid=1001(irisusr) groups=1001(irisusr)
[root@hmsCentOS7 ~]# id iscagent
uid=1002(iscagent) gid=1002(iscagent) groups=1002(iscagent)
[root@hmsCentOS7 ~]#
```
**查看文件系统权限**
```sh
[root@hmsCentOS7 ~]# ls -l /isc
total 8
drwxr-xr-x. 2 root root 6 Apr 1 23:57 data
drwxrwxr-x. 14 irisowner irisusr 4096 Apr 6 14:28 iris
drwxr-xr-x. 3 root root 1024 Apr 1 23:57 jrnpri
drwxr-xr-x. 3 root root 1024 Apr 1 23:57 jrnsec
[root@hmsCentOS7 ~]# ls -l /isc/iris
total 112
-r--r--r--. 1 irisowner irisusr 11358 Apr 6 14:28 LICENSE
-r--r--r--. 1 irisowner irisusr 534 Apr 6 14:28 NOTICE
-rwxr-xr-x. 1 irisowner irisusr 4497 Mar 7 15:20 ODBCinstall
drwxrwxr-x. 2 irisowner irisusr 26 Apr 6 14:27 SNMP
-rwxrw-r--. 1 irisusr irisusr 9703 Apr 6 14:28 _LastGood_.cpf
drwxr-xr-x. 2 root irisowner 8192 Apr 6 14:28 bin
drwxrwxr-x. 7 irisowner irisusr 106 Apr 6 14:27 csp
drwxr-xr-x. 17 irisowner irisusr 214 Apr 6 14:28 dev
drwxrwxr-x. 3 irisowner irisusr 20 Apr 6 14:28 devuser
drwxr-xr-x. 3 root root 21 Apr 6 14:28 dist
drwxr-xr-x. 5 irisowner irisusr 156 Apr 6 14:28 docs
drwxr-xr-x. 5 irisowner irisusr 68 Apr 6 14:28 fop
drwxrwxr-x. 5 irisowner irisusr 41 Apr 6 14:27 httpd
-rw-rw-r--. 1 root root 9557 Apr 6 14:28 install.cpf
-rw-rw-r--. 1 irisowner irisusr 9732 Apr 6 14:28 iris.cpf
-rwxr-xr-x. 1 irisowner irisusr 9557 Apr 6 14:28 iris.cpf_20220406
-r-xr-x---. 4 irisowner irisowner 909 Apr 6 14:28 irisforce
-r-xr-x---. 4 irisowner irisowner 909 Apr 6 14:28 irisstart
-r-xr-x---. 4 irisowner irisowner 909 Apr 6 14:28 irisstop
-r--r--r--. 1 irisowner irisusr 7639 Apr 6 14:28 lgpl.txt
drwxr-xr-x. 6 irisowner irisusr 80 Apr 6 14:28 lib
drwxrwxr-x. 13 irisowner irisusr 4096 Apr 6 14:28 mgr
-rw-------. 1 root root 3299 Apr 6 14:28 parameters.isc
drwxr-xr-x. 2 irisowner irisusr 237 Apr 6 14:27 patrol
[root@hmsCentOS7 ~]# ls -l /isc/iris/mgr
total 163952
-rw-r-----. 1 irisowner irisusr 62914560 Apr 6 14:31 IRIS.DAT
-rw-rw----. 1 irisowner irisusr 104857600 Apr 6 14:36 IRIS.WIJ
drwxr-xr-x. 2 irisowner irisusr 4096 Apr 6 14:28 Locale
-rwxrw-r--. 1 irisusr irisusr 66 Apr 6 14:28 SystemMonitor.log
drwxrwxr-x. 2 irisusr irisusr 6 Apr 6 14:28 Temp
-rwxrw-r--. 1 irisusr irisusr 134 Apr 6 14:28 alerts.log
-rwxrw-r--. 1 irisusr irisusr 13759 Apr 6 14:28 ensinstall.log
drwxrwxr-x. 3 irisowner irisusr 36 Apr 6 14:28 enslib
-rwxr-xr-x. 1 irisowner irisusr 38319 Apr 6 14:28 iboot.log
-rwxrwxrwx. 1 irisowner irisusr 0 Apr 6 14:28 ilock
-rw-rw----. 1 irisowner irisusr 10 Apr 6 14:28 iris.ids
-rw-rw----. 1 irisowner irisusr 30 Apr 6 14:28 iris.lck
-rw-rw-rw-. 1 irisowner irisusr 2 Apr 6 14:28 iris.shid
-rw-rw-r--. 1 irisowner irisusr 5 Apr 6 14:28 iris.use
drwxrwxr-x. 3 irisowner irisusr 52 Apr 6 14:28 irisaudit
drwxrwxr-x. 3 irisowner irisusr 36 Apr 6 14:28 irislib
drwxrwxr-x. 3 irisowner irisusr 52 Apr 6 14:28 irislocaldata
-rw-rw----. 1 irisowner irisusr 933 Apr 6 14:28 irisodbc.ini
drwxrwxr-x. 3 irisowner irisusr 52 Apr 6 14:28 iristemp
drwxrwxr-x. 2 irisowner irisusr 42 Apr 6 14:28 journal
-rw-rw----. 1 irisowner irisusr 211 Apr 6 14:28 journal.log
-rw-rw-r--. 1 irisowner irisusr 14146 Apr 6 14:28 messages.log
drwxrwxr-x. 2 irisowner irisusr 6 Apr 6 14:27 python
-rw-rw-rw-. 1 irisowner irisusr 55 Apr 6 14:28 startup.last
drwxrwxr-x. 2 irisowner irisusr 6 Apr 6 14:28 stream
drwxrwxr-x. 3 irisowner irisusr 52 Apr 6 14:28 user
[root@hmsCentOS7 ~]#
```
**修改文件系统权限**
将/isc/data, /isc/jrnpri, /isc/jrnsec文件系统的user和group,以及权限修改到下面的样子
```sh
[root@hmsCentOS7 ~]# chown irisowner:irisusr /isc/data /isc/jrnpri /isc/jrnsec
[root@hmsCentOS7 ~]# chmod 775 /isc/data /isc/jrnpri /isc/jrnsec
[root@hmsCentOS7 ~]# ls -l /isc
total 8
drwxrwxr-x. 2 irisowner irisusr 6 Apr 1 23:57 data
drwxrwxr-x. 14 irisowner irisusr 4096 Apr 6 14:28 iris
drwxrwxr-x. 3 irisowner irisusr 1024 Apr 1 23:57 jrnpri
drwxrwxr-x. 3 irisowner irisusr 1024 Apr 1 23:57 jrnsec
[root@hmsCentOS7 ~]#
```
**打开防火墙IRIS的TCP端口**
IRIS系统使用以下TCP端口:
- superserver port: 默认是1972
- web port: 默认是52773
- mirror port: 默认是2188
- license server port: 默认是4001, (很少使用)
```sh
[root@hmsCentOS7 iris]# firewall-cmd --permanent --add-port=1972/tcp
success
[root@hmsCentOS7 iris]# firewall-cmd --permanent --add-port=52773/tcp
success
[root@hmsCentOS7 iris]# firewall-cmd --permanent --add-port=2188/tcp
success
[root@hmsCentOS7 iris]# firewall-cmd --list-port
1972/tcp 2188/tcp 52773/tcp
[root@hmsCentOS7 iris]# firewall-cmd --reload
success
[root@hmsCentOS7 iris]#
```
**访问系统管理界面**
通过SMP(System Management Portal)的url, 您可以访问IRIS。
http://host-ipaddr:52773/csp/sys/UtilHome.csp
用户名使用superuser, 密码为您安装创建的密码。
**激活IRIS License**
到管理界面的“系统 > 软件许可颁发 > 软件许可授权码”,加载在本机保存的IRIS许可。
注意弹出窗口的文件选项默认是.key文件。所以您上传文件到Linux服务器前最好把文件改为iris.key。另外,文件和文件夹一定要可以被irisowner访问。如果放在/root文件夹,或者不运行other用户访问,您要么在选文件的窗口无法找到这个文件,要么无法成功激活。
**创建数据库**
到 "系统 > 配置 > 本地数据库"创建数据库。查看在/isc/data里的文件夹和权限。举例:创建demo数据库到/isc/data/demo:
```sh
[root@hmsCentOS7 isc]# ls -Rl /isc/data
/isc/data:
total 0
drwxrwxr-x. 3 irisusr irisusr 52 Apr 6 15:37 demo
/isc/data/demo:
total 1028
-rw-rw----. 1 irisusr irisusr 1048576 Apr 6 15:38 IRIS.DAT
-rw-rw----. 1 irisowner irisusr 30 Apr 6 15:37 iris.lck
drwxrwxr-x. 2 irisusr irisusr 6 Apr 6 15:37 stream
/isc/data/demo/stream:
total 0
[root@hmsCentOS7 isc]#
```
**设置Journal文件夹**
到“系统 > 配置 > Journal 设置”设置journal的主备路径到/isc/jrnprm和/isc/jrnsec。
查看两个路径里的文件权限是660(rw-rw----)
```sh
[root@hmsCentOS7 opt]# ls -l /isc/jrnpri
total 272
-rw-rw----. 1 irisowner irisusr 262144 Apr 6 15:29 20220406.002
-rw-rw----. 1 irisowner irisusr 30 Apr 6 15:29 iris.lck
drwx------. 2 irisowner irisusr 12288 Apr 1 23:57 lost+found
[root@hmsCentOS7 opt]# ls -l /isc/jrnsec
total 15
-rw-rw----. 1 irisowner irisusr 30 Apr 6 15:29 iris.lck
drwx------. 2 irisowner irisusr 12288 Apr 1 23:57 lost+found
[root@hmsCentOS7 opt]#
```
**启动ISCAgent**
如果需要配置镜像,服务器需要人工启动ISCAgent
```bash
# 启动iscagent服务
systemctl start ISCAgent.service
# 设置iscagent
systemctl enable ISCAgent.service
```
**SELinux配置**(Optional)
如果您上面执行的是“**执行customer安装以安装WebGateway**”,那么这里您需要配置SELinux。
SELinux会限制httpd对系统其它文件的访问权限,比如说//usr/sbin/httpd无法访问IRIS的WebGateway, 它工作在/opt/webgateway/bin目录。你需要做以下几步来保证SELinux不再限制对IRIS文件的访问:
- 允许httpd读写WebGateway文件
```sh
# httpd_sys_content_t – set on directories that Apache is allowed access to,
# httpd_sys_rw_content_t – set on directories that Apache is allowed read/write access # httpd_sys_script_exec_t – used for directories that contain executable scripts.
[root@hmsCentOS7 conf]# ls -Z /opt/webgateway/conf
-rw-------. apache root unconfined_u:object_r:httpd_sys_content_t:s0 CSP.ini
-rw-------. apache root unconfined_u:object_r:httpd_sys_content_t:s0 CSPRT.ini
[root@hmsCentOS7 conf]# semanage fcontext -a -t httpd_sys_rw_content_t /opt/webgateway/conf/CSP.ini
[root@hmsCentOS7 conf]# restorecon -v /opt/webgateway/conf/CSP.ini
restorecon reset /opt/webgateway/conf/CSP.ini context unconfined_u:object_r:httpd_sys_content_t:s0->unconfined_u:object_r:httpd_sys_rw_content_t:s0
[root@hmsCentOS7 conf]# semanage fcontext -a -t httpd_sys_rw_content_t /opt/webgateway/conf/CSPRT.ini
[root@hmsCentOS7 conf]# restorecon -v /opt/webgateway/conf/CSPRT.ini
restorecon reset /opt/webgateway/conf/CSPRT.ini context unconfined_u:object_r:httpd_sys_content_t:s0->unconfined_u:object_r:httpd_sys_rw_content_t:s0
[root@hmsCentOS7 conf]# ls -Z
-rw-------. apache root unconfined_u:object_r:httpd_sys_rw_content_t:s0 CSP.ini
-rw-------. apache root unconfined_u:object_r:httpd_sys_rw_content_t:s0 CSPRT.ini
[root@hmsCentOS7 conf]#
[root@hmsCentOS7 webgateway]# semanage fcontext -a -t httpd_sys_rw_content_t /opt/webgateway/logs/CSP.log
[root@hmsCentOS7 webgateway]# restorecon -v /opt/webgateway/logs/CSP.log
restorecon reset /opt/webgateway/logs/CSP.log context unconfined_u:object_r:httpd_sys_content_t:s0->unconfined_u:object_r:httpd_sys_rw_content_t:s0
[root@hmsCentOS7 webgateway]#
```
- 允许httpd读写IRIS的Web Application文件,假设文件目录是/isc/web, -R是recursively
```sh
semanage fcontext -a -t httpd_sys_rw_content_t "/isc/web(/.*)?"
restorecon -Rv /isc/web/
```
- 运行httpd到IRIS的连接, (最新版本也许不需要手工配置了)
```sh
# 默认的superserver端口为1972, 上面的iris2使用的是51773
[root@hmsCentOS7 ~]# semanage port -a -t http_port_t -p tcp 51773
ValueError: Port tcp/51773 already defined
[root@hmsCentOS7 ~]# semanage port -a -t http_port_t -p tcp 1972
[root@hmsCentOS7 ~]# semanage port -l | grep http_port
http_port_t tcp 1972, 51773, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
[root@hmsCentOS7 ~]# setsebool -P httpd_can_network_connect 1
[root@hmsCentOS7 ~]#
```
到这里, 您的IRIS安装过程已经结束了。后面的实施工作可能包括:
- IRIS配置
- 镜像配置
- WebGateway配置
我会在其他文章中介绍上述内容。
另外, 请注意重启(reboot)在安装过程中十分重要: 通常的情况是,至少有一些配置在第一次重启时并不存在。这可能包括被挂载的卷、/etc/fstab中的错误、启动时不启动的服务、在没有重载服务的情况下进行的配置修改等等。
一旦你认为服务器已经完成,并验证所有的配置都符合预期,而且应用程序仍在工作,那么重新启动服务器是非常明智的。如果不这样做,也不测试集群(例如,一次重启一个节点),可能意味着在第一次重启或HA事件中出现灾难。
*The End*
公告
Claire Zheng · 六月 14, 2023
InterSystems 已纠正导致进程内存使用量增加的缺陷。
具体来说,在对局部变量执行$Order 、 $Query 或 Merge时,会出现本地进程分区内存消耗增加的问题。虽然这对大多数运行环境没有不利影响,但支持大量进程或严格限制每个进程最大内存使用的环境可能会受到影响。某些进程可能会遇到<STORE> 错误。
该缺陷存在于2023.1.0.229.0中,但它被重新发布为2023.1.0.235.1,并包含了修复程序,以加快修正,而无需客户等待维护版本。
此缺陷的更正标识为 DP-423127 和 DP-423237。这些将包含在所有未来版本中。
该缺陷出现在 InterSystems IRIS ® 、InterSystems IRIS for Health ™ 和HealthShare ® Health Connect 的版本 2022.2、2022.3 和 2023.1(内部版本 229)中。如果您运行的是这些版本之一,我们建议升级到 2023.1(内部版本 235)。
此修复也可通过 Ad hoc 分发获得。
如果您对此警报有任何疑问,请联系全球响应中心。
公告
Claire Zheng · 五月 19, 2022
在集成平台建设如火如荼的今天,如何能最大程度发挥集成平台价值,让集成平台不再止步于业务系统接口的打通,而是真正作为医院的IT基础架构,释放出更大价值?5月27日,InterSystems技术总监乔鹏 ( @Qiao.Peng )和InterSystems销售工程师王菁伟( @Jingwei.Wang )将针对集成平台建成后的应用价值,围绕“业务流程再造”角度,探讨以低代码方式梳理并再造业务闭环流程、从而赋能业务创新并促进医院精细化管理和高质量发展。点击链接或扫描报名。
文章
Claire Zheng · 四月 21, 2021
在医院信息化建设中,如何打通医院的各个系统,给患者提供连续、无缝的良好体验,集成平台发挥着重要作用。而集成平台方案如何适应现在的多云时代、需要具备什么样的特性、如何与多云环境更好地结合以便为医院的信息化建设带来更多的便利?面对这一系列问题,InterSystems中国业务拓展经理李岩为您解读InterSystems集成平台方案的特点和优势,以及构建在VMware云方案上的最佳实践,让您了解云环境下集成平台方案的新特性和优势。
文章
姚 鑫 · 五月 10, 2022
# 第138章 SQL函数 TIMESTAMPADD
一个标量日期/时间函数,它返回一个新的时间戳,该时间戳是通过将指定日期部分的多个间隔添加到时间戳来计算的。
# 大纲
```java
{fn TIMESTAMPADD(interval-type,integer-exp,timestamp-exp)}
```
# 参数
- `interval-type` - `integer-exp` 表示的时间/日期间隔类型,指定为关键字。
- `integer-exp` - 要添加到 `timestamp-exp` 的整数值表达式。
- `timestamp-exp` - 时间戳值表达式,将增加 `integer-exp` 的值。
# 描述
`TIMESTAMPADD` 函数通过将指定的日期部分增加指定的单位数来修改日期/时间表达式。例如,如果 `interval-type` 是 `SQL_TSI_MONTH` 并且 `integer-exp` 是 `5`,则 `TIMESTAMPADD` 将 `timestamp-exp` 增加五个月。还可以通过为 `integer-exp` 指定负整数来减少日期部分。
`TIMESTAMPADD` 返回与输入`timestamp-exp` 数据类型相同的时间戳。此时间戳可以是 `%Library.TimeStamp` 数据类型格式 (`yyyy-mm-dd hh:mm:ss.ffff`) 或 `%Library.PosixTime` 数据类型格式(编码的 `64` 位有符号整数)。
请注意,`TIMESTAMPADD` 只能用作 `ODBC` 标量函数(使用大括号语法)。
可以使用 `DATEADD` 通用函数对时间戳执行类似的时间/日期修改操作。
# Interval Types
间隔类型参数可以是以下时间戳间隔之一:
- `SQL_TSI_FRAC_SECOND`
- `SQL_TSI_SECOND`
- `SQL_TSI_MINUTE`
- `SQL_TSI_HOUR`
- `SQL_TSI_DAY`
- `SQL_TSI_WEEK`
- `SQL_TSI_MONTH`
- `SQL_TSI_QUARTER`
- `SQL_TSI_YEAR`
这些时间戳间隔可以使用单引号或双引号来指定,带或不带引号。它们不区分大小写。
增加或减少时间戳间隔会导致其他间隔被适当地修改。例如,增加午夜过后的小时数会自动增加天数,而这又会增加月数,依此类推。 `TIMESTAMPADD` 总是返回一个有效的日期,考虑到一个月的天数,并计算闰年。例如,将 1 月 31 日增加一个月会返回 2 月 28 日(该月中的最高有效日期),除非指定的年份是闰年,在这种情况下它会返回 2 月 29 日。
可以按三位精度的小数秒递增或递减。将小数秒指定为千分之一秒的整数计数(001 到 999)。
`DATEADD` 和 `TIMESTAMPADD` 处理季度(3 个月间隔); `DATEDIFF` 和 `TIMESTAMPDIFF` 不处理宿舍。
# %TimeStamp 格式化
如果 `timestamp-exp` 参数采用 `%Library.TimeStamp` 数据类型格式 (`yyyy-mm-dd hh:mm:ss.ffff`),则适用以下规则:
- 如果 `timestamp-exp` 仅指定时间值,则在计算生成的时间戳之前,`timestamp-exp` 的日期部分设置为`“1900-01-01”`。
- 如果 `timestamp-exp` 仅指定一个日期值,则在计算结果时间戳之前,`timestamp-exp` 的时间部分会设置为`“00:00:00”`。
- `timestamp-exp` 可以包括或省略小数秒。 `timestamp-exp` 可以包含任意位数的精度,但间隔类型 `SQL_TSI_FRAC_SECOND` 指定精确的三位精度。尝试指定小于或大于三位数的 `SQL_TSI_FRAC_SECOND` 可能会产生不可预知的结果。
# 范围和值检查
`TIMESTAMPADD` 对 `%Library.TimeStamp` 输入值执行以下检查:
- 在执行任何 `TIMESTAMPADD` 操作之前,`timestamp-exp` 的所有指定部分都必须有效。
- 日期字符串必须完整且格式正确,其中包含适当数量的元素和每个元素的数字,以及适当的分隔符。年份必须指定为四位数。无效的日期值会导致 `SQLCODE -400` 错误。
- 日期值必须在有效范围内。年:`0001` 到 `9999`。月:1 到 12。日:1 到 31。小时:00 到 23。分:0 到 59。秒:0 到 59。一个月中的天数必须与月和年相匹配。例如,日期`“02–29”`仅在指定年份是闰年时有效。无效的日期值会导致 `SQLCODE -400` 错误。
- 返回的递增(或递减)年份值必须在 `0001` 到 `9999` 范围内。超出此范围递增或递减返回 。
- 小于 `10` 的日期值可以包括或省略前导零。不允许使用其他非规范整数值。因此,`Day` 值`“07”`或`“7”`有效,但`“007”`、`“7.0”`或`“7a”`无效。小于 `10` 的日期值始终以前导零返回。
- 时间值可以全部或部分省略。如果 `timestamp-exp` 指定了不完整的时间,则为未指定的部分提供零。
- 小于 `10` 的小时值必须包含前导零。省略此前导零会导致 `SQLCODE -400` 错误。
# 示例
以下示例将 `1` 周添加到原始时间戳:
```sql
SELECT {fn TIMESTAMPADD(SQL_TSI_WEEK,1,'2017-12-20 12:00:00')}
```
以下示例将 `5` 个月添加到原始时间戳:
```sql
SELECT {fn TIMESTAMPADD(SQL_TSI_MONTH,5,'2022-12-20 12:00:00')}
```
以下示例将原始时间戳增加 `45` 分钟:
```sql
SELECT {fn TIMESTAMPADD(SQL_TSI_MINUTE,45,'2017-12-20 00:00:00')}
```
以下示例将原始时间戳减少 `45` 分钟:
```sql
SELECT {fn TIMESTAMPADD(SQL_TSI_MINUTE,-45,'2017-12-20 00:00:00')}
```
文章
姚 鑫 · 五月 20, 2022
# 第148章 SQL函数 $TRANSLATE
执行逐字符替换的字符串函数。
# 大纲
```java
$TRANSLATE(string,identifier[,associator])
```
# 参数
- `string` - 目标字符串。它可以是字段名称、文字、主机变量或 SQL 表达式。
- `identifier` - 要在字符串中搜索的字符。它可以是字符串或数字文字、主变量或 SQL 表达式。
- `associator` - 可选 — 与标识符中的每个字符对应的替换字符。它可以是字符串或数字文字、主变量或 SQL 表达式。
# 描述
`$TRANSLATE` 函数在返回值字符串中执行逐字符替换。它一次处理一个字符的字符串参数。它将字符串中的每个字符与标识符参数中的每个字符进行比较。如果 `$TRANSLATE` 找到匹配项,它会记下该字符的位置。
- `$TRANSLATE` 的双参数形式从输出字符串中删除标识符参数中的所有字符实例。
- `$TRANSLATE` 的三参数形式将在字符串中找到的每个标识符字符的所有实例都替换为位置对应的关联字符。替换是基于字符而不是字符串执行的。如果标识符参数包含的字符多于关联参数,则从输出字符串中删除标识符参数中多余的字符。如果标识符参数包含的字符少于关联参数,则忽略关联参数中多余的字符。
`$TRANSLATE` 区分大小写。
`$TRANSLATE` 不能用于将 `NULL` 替换为字符。
如果指定的参数太少,则会发出 `SQLCODE -380`。如果指定的参数过多,则会发出 `SQLCODE -381`。
# $TRANSLATE and REPLACE
`$TRANSLATE` 执行逐字符匹配和替换。 `REPLACE` 执行字符串对字符串的匹配和替换。 `REPLACE` 可以用另一个子字符串替换一个或多个字符的单个指定子字符串,或删除指定子字符串的多个实例。 `$TRANSLATE` 可以用相应的指定替换字符替换多个指定字符。
默认情况下,这两个函数都区分大小写,从字符串的开头开始,并替换所有匹配的实例。 `REPLACE` 具有可用于更改这些默认值的参数。
# 示例
在以下示例中,两个参数 `$TRANSLATE` 通过删除标点符号(逗号、空格、句点、撇号、连字符)来修改名称值,返回仅包含字母字符的名称。请注意,标识符将撇号加倍以将其转义为文字字符,而不是字符串分隔符:
```sql
SELECT TOP 20 Name,$TRANSLATE(Name,', .''-') AS AlphaName
FROM Sample.Person
WHERE Name %STARTSWITH 'O'
```
在以下示例中,三参数 `$TRANSLATE` 通过将逗号和空格替换为插入符号 (`^`) 字符来修改名称值,返回以三部分分隔的名称(姓氏、名字、中间名首字母)。请注意,关联者必须指定`“^”`的次数与标识符中的字符数一样多:
```sql
SELECT TOP 20 Name,$TRANSLATE(Name,', ','^^') AS PiecesNamePunc
FROM Sample.Person
WHERE Name %STARTSWITH 'O'
```
在以下示例中,三参数 `$TRANSLATE` 通过将逗号和空格替换为脱字符 (`^`) 字符(在标识符和关联符中指定)和删除句点、撇号和连字符(在标识符中指定,从关联人):
```sql
SELECT TOP 20 Name,$TRANSLATE(Name,', .''-','^^') AS PiecesNameNoPunc
FROM Sample.Person
WHERE Name %STARTSWITH 'O'
```
你好,我用replace,想把一列中带有换行的数据,替换成不带空格的,但是输出后显示乱码,直接查那一列正常,这是什么问题呢,请教一下
文章
Qiao Peng · 三月 10, 2022
3.1 InterSystems IRIS内码与多语言支持
3.1.1 InterSystems IRIS内码与字符集转换
InterSystems IRIS的内码是UTF-16,因此它支持Unicode多语言字符集。对于其它字符编码,例如UTF-8、GB18030、Big 5,它会自动进行转码。例如对于简体中文,它将GB18030输入数据转换为UTF-16,或者将UTF-16数据转换为GB18030输出。
因为GB18030兼容GB2312,所以InterSystems IRIS也支持GB2312。
注意:在第一篇介绍过,GB18030与GBK并不完全兼容,因此InterSystems IRIS理论上不支持GBK。
InterSystems IRIS如何做字符集编码系统间的转换?它使用2种方式:
对于可以通过算法转换的,例如UTF-8与UTF-16的相互转换,InterSystems IRIS会使用算法转换;
对于无法通过算法转换的,例如与UTF-16的相互转换,InterSystems IRIS会使用I/O转换表转换,它其实是两个映射关系表,一个用于特定字符集转UTF-16、另一个用于UTF-16转特定字符集。
注意,大家可能会注意到,GB18030的I/O转换表里并没有所有的GB18030编码,这是为什么呢?回顾一下第一篇关于GB18030的介绍,它提到了GB18030编码中一部分与Unicode编码非连续相关,而另一部分与Unicode编码连续相关。在InterSystems IRIS的GB18030的I/O转换表,其实只有与Unicode编码非连续相关的那部分编码,就是需要通过对照表关联的部分;而连续相关的那部分,是通过算法转换的,因此不在I/O转换表里。这么做的目的是降低把GB18030这么大的代码表全部加载到内存里的硬件成本。
3.1.2 字符集相关的命令、函数和方法
InterSystems IRIS提供了一系列与字符集相关的命令、函数和方法。它们可以帮助我们理解InterSystems IRIS的字符集处理逻辑、帮忙在字符集相关问题出现时进行排错。
这里以汉字为例介绍这些命令、函数和方法。汉字的UTF-16编码的16进制值是9451、GB18030的16进制值是E861。
ZZDUMP:查看变量16进制编码的命令
例如:我们看一下变量x的16进制值
这里,可以看到变量x保存的是汉字,它的16进制的值是9451。9451就是汉字的UTF-16(Unicode)16进制码。
$ZCONVERT($ZCVT):转码函数
如果需要通过代码控制不同字符集编码间的转换,可以使用$ZCVT函数。例如,我们把上面变量x的字符转码为GB18030编码:
这个例子中,传递给$ZCVT的第一个参数是变量x;第二个参数是“O”,意思是将x的字符编码转码为目标码;第三个参数是要转换的目标编码,“GB18030”。现在变量y的值就是汉字的GB18030编码。
同样,你可以把变量y的GB18030编码再转为IRIS内码UTF-16。这时,第二个参数要设置为“I”,意思是设置源编码;而第三个参数还是“GB18030”:
现在变量z仍是汉字的UTF-16编码。
$ASCII、$WASCII :将字符转为10进制UTF-16码
这两个系统函数将所有字符转为其10进制的UTF-16码。名字有点迷惑,它们并不是获得字符的ASCII码,当然对于ASCII字符,ASCII码和UTF-16码是一样的。
其中$ASCII可以将UCS基本平面的字符转为UTF-16,也就是双字节UTF-16编码。例如汉字的就是这样的:
但那些超过双字节UTF-16的汉字就需要用$WASCII来获取其UTF-16的值了。例如汉字“”,它的UTF-16编码是4字节的D85FDFF9,获取它的UTF-16值,就需要用$WASCII($WA)。当然,也可以全用$WASCII来获取所有字符的UTF-16编码。
$CHAR、$WCHAR: 将10进制UTF-16码转为字符
这两个系统函数将10进制的UTF-16码转为字符。例如:
同样,$CHAR可以转双字节的UTF-16;$WCHAR可以转双字节或四字节的UTF-16。
$ZHEX:将16进制数转10进制数、10进制数转16进制数
上面有些函数处理16进制数、一些处理10进制数,可以用函数$ZHEX做10进制和16进制数的转换。例如:
USER>w $ZHEX("E861")
59489
大家可能对这个函数比较迷惑:只有一个参数,那么怎么知道它是10进制数还是16进制数呢?例如9451,既可以表达一个10进制数,也可以表达一个16进制数。$ZHEX是这么判断的:是以字符串传入的参数(加了双引号的)就是16进制,而以数字传入的参数(没加双引号的)就是10进制。因此会得到这样的结果:
USER>w $ZHEX(9451)
24EB
USER>w $ZHEX("9451")
37969
3.2 常见字符集相关问题
既然InterSystems IRIS支持GB18030-2005,那么还会有中文字符集相关问题吗?还是会有,因为InterSystems IRIS不仅是一个数据库,它的互操作功能会和各种数据源和数据目标连接,接收和发送各种编码的数据。如果数据源/数据目标所声明使用的字符集与其实际使用的字符集不同,或者未声明使用的字符集并且实际字符集和IRIS默认的字符集不符,就会造成问题。这也是绝大多数的InterSystems IRIS相关字符集问题的根源。
所以在InterSystems IRIS中遇到字符乱码问题时,首先应该看一下数据声明的字符集是什么,实际收到数据的字符集是什么。数据声明的字符集信息,可以看上一篇《各种技术对字符集使用的声明》的介绍,而实际收到数据的字符集可以使用Wireshark等工具检查。
下面列举一些常见的字符集相关的问题处理方式:
3.2.1 文件
对于正确编码的文件,InterSystems IRIS都可以正常处理。但如果文件声明的字符集编码与实际的编码不同时,可以使用$ZCVT进行转码。
如果在使用文件(File)或FTP适配器,这2个适配器都会CHARSET设置项,可以使用这个设置项做InterSystems IRIS内码(UTF-16)和真实需要的字符编码间自动做相互转换。
InterSystems IRIS提供了好几个字符文件的操作类:%Library.File、%Library.FileCharacterStream、%Stream.FileCharacter。在使用它们创建文件时,需要注意指明文字字符集,否则默认为ANSI,从而造成生僻字异常。
InterSystems IRIS不同的字符文件操作类,对于字符集的声明稍有差异,如下:
对于%Library.File,在执行Open方法时设置字符集,例如设置为UTF8
Set tFile = ##class(%File).%New("c:\temp\test.txt")
Do tFile.Open("WSN:/IOTABLE=""UTF8""")
对于%Library.FileCharacterStream,设置其TranslateTable属性,或调用TranslateTableSet方法设置
Set tStream=##class(%FileCharacterStream).%New()
Set tStream.Filename="c:\temp\test.txt"
Set tStream.TranslateTable="UTF8"
对于%Stream.FileCharacter,设置其TranslateTable属性,或调用TranslateTableSet方法设置
Set tStream = ##class(%Stream.FileCharacter).%New()
Set tST=tStream.LinkToFile("C:\temp\test.txt")
Set tStream.TranslateTable="UTF8"
另外,还要考虑BOM问题,有些文本编辑器打开没有BOM的UTF-8文件时会显示乱码、而另外一些有BOM反而显示乱码。 对于BOM,%Library.File无法在文件头插入BOM,%Library.FileCharacterStream、%Stream.FileCharacter可以通过设置其BOM属性,例如设置字符集为UTF8,且设置BOM为UTF8的EF BB BF(10进制239 187 191):
Set tStream = ##class(%Stream.FileCharacter).%New()
Set st= tStream.LinkToFile("C:\temp\test.txt")
Set tStream.TranslateTable="UTF8"
Set tStream.BOM=$char(239,187,191)
Do tStream.Write($C(8224))
Do tStream.%Save()
从性能和功能角度,推荐使用%Stream.FileCharacter和%Library.FileCharacterStream,而不是%Library.File。
3.2.2 数据库
通过InterSystems IRIS连接到第三方数据库进行查询或更新数据操作而出现乱码是比较典型的字符集问题。
当遇到问题时,尤其是Oracle数据库时,首先检查一下数据源的内码设置。如果是其内码设置问题,那么通常需要通过$ZCVT来转码。
如果不是内码设置问题,查一下InterSystems IRIS使用什么方式连接到对方数据库:ODBC还是JDBC。如果是JDBC,看看连接字符串中的字符集设置是否正确;如果是ODBC,看看是不是生僻字乱码,如果是可能需要用$ZCVT转码,否则要检查ODBC驱动是否正确,尤其是是否在使用其ODBC3.5的驱动。
3.2.3 HTTP
遇到HTTP相关的字符乱码,首先查一下HTTP头Content-Type的参数charset设置。如果对方没有设置或设置不正确,且对方不能修稿,可以使用$ZCVT转码。
对于使用HTTP适配器的IRIS业务服务,可以通过其CHARSET设置项来配置字符集,并通过"FORCE CHARSET" 设置项强制跳过HTTP头Content-Type的参数charset设置。
3.2.4 SOAP/REST传递的XML字符流/字符串
首先检查下encoding属性的设置。如果它没有设置或设置错误,且不能修改,可以使用$ZCVT转码。
3.2.5 HL7 V2消息
HL7 V2是医疗行业常用的消息协议,InterSystems IRIS提供了大量的工具和特性以支持HL7 V2消息。
如果是HL7 V2传输中出现的中文乱码问题,首先查一下MSH-18的设置。如果数据源没有设置或设置错了,都可以使用InterSystems IRIS数据转换能力先将其修正为正确的值。当然有可能接收目标系统不按MSH-18设置的字符集解码数据,这时,可以按目标系统要求的字符集来编码数据,而忽略MSH-18。
InterSystems IRIS提供了很多工具,可以查看HL7 V2消息或文件的内容, 例如HL7查看器、消息追踪。InterSystems IRIS会按MSH-18设置的值进行数据的解码,当MSH-18值缺失时,默认值是Latin1。如果是因为MSH-18缺失而造成中文显示为乱码,且HL7 V2消息源无法修改时,可以考虑修改EnsLib.HL7.Util.IOFraming的DefCharEncoding(字符集编码默认值)为消息源使用的字符集。
注意,这种乱码情况不会影响HL7消息的接受接收和发送,仅影响显示。
3.2.6 其它
可能还会碰到一些的中文乱码其实是显示问题,尤其是那些仅生僻字显示有问题的情况。
出现这类显示问题的原因是并不是所有的操作系统和IT工具都支持完整的汉字字符集或汉字字形。
例如,常见的字符终端工具仅支持GB2312,所以对GB2312字符集之外的汉字就会显示为一个特定的符号,看起来就像乱码。
而MacOS的Safari浏览器、Pages文稿和很多应用都不能显示一些GB18030字符集的生僻字,例如:
这种情况下,数据本身没有问题,只是显示不正常而已,通常不需要担心。
这就是InterSystems IRIS多语言字符集的支持的主要内容内容。后面我会持续将客户遇到的与字符集相关的典型问题持续更新到文章的末尾,供大家参考。
附录1: 列表类型的中文数据显示乱码?
最近一个客户问了一个中文显示乱码问题。经过查看,发现乱码字段/属性的类型是list of %String,而且使用逻辑模式查看数据。换成ODBC模式或显示模式就没有问题了。原因是列表元素间是有特殊控制字符的,不同显示模式处理列表类型的数据方式不同,详见 显示模式 。对于列表类型的属性/字段,建议通过STORAGEDEFAULT="array" 将其映射为SQL子表,从而更容易通过SQL查看和操作数据,同时对象和global的访问不产生任何影响。例如:
Property MyList as list of %String (STORAGEDEFAULT="array");
文章
姚 鑫 · 四月 23, 2022
# 第121章 SQL函数 RPAD
字符串函数,它返回一个右填充到指定长度的字符串。
# 大纲
```java
RPAD(string-expression,length[,padstring])
```
# 参数
- `string-expression` - 字符串表达式,可以是列名、字符串文字、主机变量或另一个标量函数的结果。可以是可转换为 VARCHAR 数据类型的任何数据类型。字符串表达式不能是流。
- `length` - 整数,指定返回的字符串中的字符数。
- `padstring` - 可选 — 由一个字符或一串字符组成的字符串,用于填充输入字符串表达式。 `padstring` 字符或字符附加到 `string-expression` 的右侧,以提供创建长度字符的输出字符串所需的尽可能多的字符。 `padstring` 可以是字符串文字、列、主机变量或另一个标量函数的结果。如果省略,则默认为空格字符。
# 描述
`RPAD` 用尾随填充字符填充字符串表达式。它返回填充到长度字符数的字符串的副本。如果字符串表达式的长度超过 `length` 个字符,则返回字符串被截断为 `length` 个字符。
如果 `string-expression` 为 `NULL`,则 `RPAD` 返回 `NULL`。如果 `string-expression` 为空字符串 (`''`) ,则 `RPAD` 返回一个完全由填充字符组成的字符串。返回的字符串是 `VARCHAR` 类型。
`RPAD` 可用于针对链接表的查询。
`RPAD` 不会删除前导或尾随空格;它填充字符串,包括任何前导或尾随空格。要在填充字符串之前删除前导或尾随空格,请使用 `LTRIM`、`RTRIM` 或 `TRIM`。
# 示例
以下示例用 `^` 字符(在需要时)右填充列值以返回长度为 `16` 的字符串。请注意,某些名称字符串被右填充,某些名称字符串被右截断以返回长度为 `16` 的字符串。
```sql
SELECT TOP 15 Name,RPAD(Name,16,'^') AS Name16
FROM Sample.Person
```
以下示例使用 `^=^` 填充字符串(在需要时)填充列值以返回长度为 `20` 的字符串。请注意,填充名称字符串根据需要重复多次,并且一些返回字符串包含部分填充字符串:
```sql
SELECT TOP 15 Name,RPAD(Name,20,'^=^') AS Name20
FROM Sample.Person
```
文章
Hao Ma · 四月 18, 2021
IRIS相比Caché在部署上的一个进步是支持docker。即便不是云部署, 使用docker也带来非常多的便利。 尤其是在开发测试环节,由于docker的使用更便捷,除非要模拟客户的环境或者做规定的性能测试,我在测试中基本已经不再使用本机的实例或者虚机。IRIS的联机文档有[详细的IRIS docker安装使用指导](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ADOCK#ADOCK_iris_running_compose),本文只是一个简单的,快速上手的**在测试环境**安装IRIS docker的简单步骤,尤其适合初学者。
注意Windows上docker可能会遇到这样那样的问题,因此通常还是推荐在Linux或者Mac OS上使用。正式的生产环境的IRIS docker container也是不支持Windows系统的。
> Referrence
- [First Look: InterSystems Products in Docker Containers](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=AFL_containers)
- [Running an InterSystems IRIS Container: Docker Run ExamplesRunning an InterSystems IRIS Container: Docker Run Examples](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ADOCK#ADOCK_iris_running_dockerrun)
##1. 在操作系统上安装Docker环境
[Docker官方文档的安装步骤](https://docs.docker.com/engine/install/)非常清晰,我按照上面的步骤在MAC和CentOS上安装docker从来没有出现过问题。恰恰是这个文档中没有的Redhat上的安装,过程中曾碰到过几个问题,在网上搜索了答案,也不算困难。
简单的复述一下步骤:root用户的最简单安装,没有权限问题, 没有docker网络修改等等:
1. 安装yum-util, 用于添加yum源,如果您的系统中已经有了yum-utils包这步可以省略
sudo yum install -y yum-utils
2. 添加docker的Repo到yum源并确认
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum repolist
3. 安装3个docker组件
sudo yum install docker-ce docker-ce-cli containerd.io
4. 启动Docker
sudo systemctl start docker
5. 确认安装成功。'docker run'命令会去本地的库里找'hello-world',没有找到就去网上下一个"images",然后创建一个docker容器给你使用。
sudo docker run hello-world
安装结束您想要到注册一个账户,用来下载上传docker image。 下载命令使用'docker pull', 比如
```
docker pull nginx
```
## 2. 下载IRIS Docker image
在线文档[Container Images Available from InterSystems](https://docs.intersystems.com/components/csp/docbook/Doc.View.cls?KEY=PAGE_containerregistry#PAGE_containerregistry)中介绍了网站上可以下载的IRIS images的列表,其中community版本不需要license,其他的版本需要从InterSystems处获得IRIS docker版的专用license.
下面是登录并下载iris docker image的记录。从网页登录,您会得到docker的登录密码"使用的密码"jaRWSBJjcUcNprCKTuMX10PYHNq2IYPrAQoYdp6Siokb"。
[root@centos7 ~]# docker login -u="hma" -p="jaRWSBJjcUcNprCKTuMX10PYHNq2IYPrAQoYdp6Siokb" containers.intersystems.com
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@centos7 ~]# docker pull containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0
2020.3.0.304.0: Pulling from intersystems/iris-ml
5c939e3a4d10: Pull complete
c63719cdbe7a: Pull complete
19a861ea6baf: Pull complete
651c9d2d6c4f: Pull complete
d21839215a64: Pull complete
7995f836674b: Pull complete
841ee3aaa7aa: Pull complete
739c318c2223: Pull complete
d76886412dda: Pull complete
Digest: sha256:4c62690f4d0391d801d3ac157dc4abbf47ab3d8f6b46144288e0234e68f8f10e
Status: Downloaded newer image for containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0
containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0
[root@centos7 ~]#
另外,您也可以从InterSystems的技术支持网站下载iris docker的压缩包"iris*.tar.gz",然后使用"docker load"安装, 比如:
CNMBPHMA:~ hma$ docker load -i iris-2020.4.0.524.0-docker.tar.gz
## 3. 创建并运行IRIS Container
###简单的办法
如果是只是简单的测试,可以直接运行,但如果不是community版本的docker, 您还需要把license拷贝到container内部。 比如下面的步骤
CNMBPHMA:~ hma$ docker run -d -i -p 52773:52773 -p 51773:51773 --name iris20204 intersystems/irishealth:2020.2.0.211.0
CNMBPHMA:~ hma$ docker cp iris.key iris20204:/usr/irissys/mgr/iris.key
需要注意的是,不同版本的超级端口可能不同,有些是1972,有些是51773。为了省事,您也许可以使用"-P"把所有container内部的端口都映射出来。
除了要拷贝license到container内部,在做测试的时候,您可能还要经常的使用"docker cp"把各种测试文件拷入container。而且,当查看和修改container内部文件的使用,还需要使用下面的命令进入container内部:
CNMBPHMA:~ hma$ docker exec -it iris20204 /bin/sh
因此,如果是您需要一个经常使用的iris container环境,我还是建议您使用下面的方法。
### IRIS Container使用外部存储
简单的说,下面的命令
- 使用"--volume"参数为container创建外部存储,将host上的"/root/data/dur"文件夹和container内部的"/dur"文件夹链接起来。(/root/data/dur文件夹要在host上手工创建,这只是一个示意,您可以使用任何可用的目录)
- ISC_DATA_DIRECTORY环境设置会在创建iris container时在/dur文件夹下创建一个子目录”/dur/irisepy",所有IRIS运行的日志,客户配置,mgr目录下的用户数据都会保存在这个目录。因为"/dur"是外部存储,即使docker container被删除数据也不会丢失。这对container的重新创建或者iris升级都带来很大的方便。在线文档上对如果覆盖或者升级带有外部存储的iris container有详细的介绍。
- “key"参数定义了在IRIS container创建时会把"/dur/license"目录下的iris.key拷贝到iris安装目录的mgr下并激活。也就是说,在运行命令前, 您需要在host上在"/root/data/dur"目录下创建"license"子目录并将iris.key拷贝进去。
docker run --name irisepy --init -d\
-p 9091:1972 -p 9092:52773\
-v /root/data/dur:/dur\
--env ISC_DATA_DIRECTORY=/dur/irisepy \
containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0 \
--key /dur/license/iris.key
希望您喜欢使用docker
公告
Claire Zheng · 十月 9, 2022
2022年9月5日-10月24日(北京时间),我们正在举办🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)!投票截止至10月23日,你的支持与喜爱,是作者获得“开发者社区奖”的关键!如何为你喜欢的作品投票呢?
第一步,你需要成为开发者社区的活跃用户(Active User)
成功注册后,在社区发帖、点赞、回复问题等,接下来需要……等24小时。因为我们的系统会每天进行一次active user的更新。
成为Active user后,就可以给你心仪的项目投票啦!
第二步,点击进入参赛页面🏆InterSystems开发者社区中文版首届技术征文大赛🏆
第三步,在参赛页面查看所有文章,看到感兴趣的文章,就可以点赞点赞,你可以为你喜欢的每篇文章点赞一次。
10月24日,我们将宣布获奖名单!
欢迎大家积极投稿、点赞、分享、学习!
欢迎关注InterSystems开发者社区中文版首届技术征文大赛
文章
jingqi LIu · 三月 3, 2021
在InterSystems IRIS中使用ObjectScript构建REST API。
开发的API可以遵循OPEN API规范,可以使用Docker和VSCode开发,可以部署为ZPM模块,同时也可用作酒店超售系统的Data API。
什么是酒店超售管理系统?
超售管理系统结合了酒店的独特条件,例如房价,订购渠道,客户需求等。系统使用机器学习算法(例如:KNN / ES-RNN ...)来准确预测酒店的每日未入住和入住率,并进一步与收益方程式结合以找到最佳的最大客房销售量,从而可以大大增加酒店的边际收益。
来看看我们的Repo!
https://github.com/BroadCastAir/hotel_api
和
https://github.com/BroadCastAir/Hotel_OverBooking_Sys
投票支持我们的应用程序!
InterSystems IRIS不仅在医疗保健行业,在零售和酒店业中也具有广阔的发展前景。
InterSystems IRIS不仅在医疗保健行业,在零售和酒店业中也具有广阔的发展前景。说的好! 了解了,行业的应用证明了系统的可用性 希望多支持! 这是应用在其他行业中的典型案例,很棒! 看到了酒店行业应用,棒👍
文章
Michael Lei · 五月 23, 2022
大家是不是经常遇到以下情况:
系统有 bug 但是无法在本地复现
你需要在受影响的实例中运行几行代码
能完整访问系统管理门户,但是没有终端或者管理控制台, 也不能访问 Studio, Atelier 或者 VSCode
你要怎么运行你的几行代码来测试???
进入SMP/资源管理器/SQL标签=执行查询
用你需要的任何代码创建一个存储过程
复杂没有限制, 我就只做个简单的来实现可以预测的结果。
CREATE PROCEDURE RUN.ISOS()
LANGUAGE OBJECTSCRIPT
{
For i=1:1:20 write i," > "
Write "<br>THANKS !"
}
点击 EXECUTE 并看到新的 Procedure
下一步, 检查一下这个新的 Procedure 并执行它
另一个执行激活
然后得出结果
作为一个受过良好培训的专家, 记得在结束之后清空你的环境
DROP PROCEDURE RUN.ISOS
希望这个对您有所帮助.文档
文章
王喆 👀 · 十一月 17, 2022
经过一段时间的学习和使用本文总结了一些使用VsCode开发的使用方法,本文偏向于应用但会对少量的我知晓的原理进行一部分解释。
参考教程链接:https://cn.community.intersystems.com/node/488611
VSCode下载:https://code.visualstudio.com/
使用VSCode开发的优劣:
1 优势:
跨平台(Windows|MAC|Linux)开发调试远程服务端代码,而且可以快速导出COS代码(M语言也可以)。
SQL辅助查询数据
快捷的代码调试方式,一种是直接在VSCode中调试,另一种是快速复制类名和方法名在Terminal中调试。
代码智能联想补全,类似其它语言,输入开头的前几个字符可以联想后面的。
快速跳转到方法定义(ctrl+鼠标左键 | F12)
主题图标多样化,可以使用默认的黑色,当然也可以使用和studio一样的样式,链接:https://cn.community.intersystems.com/node/516996
2 劣势:
无法导入导出XML文件
缺少一些Studio的常用功能:
SOAP向导
Java网关
DT转换拖拽编写
BP流程拖拽编写
安装步骤
1官网安装Visual Studio Code编辑器
https://code.visualstudio.com/Download
安装直接下一步 - 下一步
2 汉化
如果安装为英文要切换为中文则可以通过Command Palette 中运行Configure Display Language,install another language, 选择中文,再根据提示安装相应的语言插件。
3 扩展安装
打开软件,侧边栏点击扩展按钮->搜索 "InterSystems" -> 安装扩展,如图所示:
前三个是IRIS官方推荐按安装的插件,其中InterSystems ObjectScript Extension Pack (集成好的InterSystems插件包),在此还推荐安装SQL Tools InterSystems IRIS(连接数据库插件,使用效果类似于SQLdbx)
4 配置
VSCode支持图形化的配置,但实测并不好用,而且容易保存失败,在此推荐使用settings.json
打开:设置 -> 扩展 -> InterSystems Server Manager -> settings.json
{
"intersystems.servers": {
"loc": {
"webServer": {
"scheme": "http",
"host": "127.0.0.1",
"port": 52773
},
"askForPassword": false,
"username": "Superuser",
"password":"SYS",
"description":"228"
},
},
"terminal.integrated.detectLocale": "on",
"intersystems.language-server.diagnostics.routines": true,
"editor.renderControlCharacters": false,
"editor.unicodeHighlight.ambiguousCharacters": false,
"git.autorefresh": false,
"git.autoRepositoryDetection": false,
"git.confirmEmptyCommits": false,
"git.confirmForcePush": false,
"git.confirmNoVerifyCommit": false,
"git.confirmSync": false,
"git.countBadge": "off",
"diffEditor.wordWrap": "on",
"editor.wordWrap": "on",
"workbench.colorTheme": "InterSystems Default Dark",
"workbench.editor.enablePreview": false,
"vsicons.dontShowNewVersionMessage": true,
"git.enableSmartCommit": true,
"explorer.confirmDelete": false,
"editor.fontSize": 13,
"objectscript.conn": {
"host": "127.0.0.1", // 连接数据库IP
"port": 57772, // 连接数据库端口
"username": "Superuser", // 用户名
"password": "SYS", // 密码
"ns": "BKlinik", // 命名空间
"active": true, // 是否开启
"https": true,
"server": "bklinik" // intersystems.servers中设置的数据库服务器名
},
"sqltools.connections": [
{
"namespace": "BKlinik",
"connectionMethod": "Server and Port",
"showSystem": false,
"previewLimit": 50,
"server": "localhost",
"port": 52773,
"askForPassword": false,
"driver": "InterSystems IRIS",
"name": "BKlinik",
"username": "Superuser",
"password": "SYS"
}
],
"intersystemsServerManager.credentialsProvider.deletePasswordOnSignout": "never",
}
这是我目前使用的:
intersystems.servers :指的是IRIS的服务器的设置,内部的服务器命名不可大写,相比较官方出具的设置,我增加了【"askForPassword": false, "password":"123456",】此处的增加是方便后面打开代码的时候不需要再输入密码。
5 打开代码
打开代码有两种方式:一种是直连代码打开,另一种是客户端方式连接,第一种相当于studio直接连着代码进行编辑,第二种是把代码下载到本地磁盘的对应目录进行编辑。第一种方式好处是完全无感的查看编辑代码,但是如果不小心删掉之后无法恢复。第二种方式删掉之后可以恢复,而且也可以用GIT等代码版本控制,但是如果多人同时编辑代码,可能会存在冲突覆盖的情况。
直连代码
Instersystems tools – All Servers – 【服务器名】– NameSpace – 命名空间
然后你就可以愉快的编辑代码了
客户端方式打开
首先,你得建立一个文件夹,如图:本文是在D://workspace建立的一个aaa文件
点击打开文件夹 – 选择对应文件
此时会出现一个IRIS的图标,ObjectScript,如图所示:
点击ObjectScript – Choose Server and Namespace – 选择对应的服务器
再选择你需要的命名空间 比如我这边选择的是【HSLIB】
选择你需要编辑的代码 - 右键 - 选择Export
输出的框里会显示导出详情,如下图所示:
等待导出完毕,回到代码编辑,你的代码会出现在src目录下,如图所示:
如果你了解过ZPM的话,你现在还可以在这边添加一个module.xml,方便你把这个代码导入到其它机器上,ZPM相关的知识可以去GitHub上看看,关键就两个命令 [zpm] [load -v 【路径】] 和一个文件的编写,特别好用的是导入发布订阅和查找表,导代码的话得保证你的代码一行都没有问题,如果你的代码在使用的时候跨命名空间做了一些操作的话ZPM也会报错。
如何配置GIT的话,可以通过命令行的方式在本地文件上配置,也可以在VSCode上处理,和其它代码的处理方式差不多。
如果你安装了【SQL Tools InterSystems IRIS】那么上述配置中的sqltools.connections就是你需要的连接配置,你可以尝试改成你自己的库,然后进行一些简单的SQL操作。当然个人还是推荐使用DBeaver,这个更好用。
总结
好了,以上就是如何进行VSCode开发的我的一些小分享,如果有纠正请联系!!!
非常棒的文章! 补充InterSystems使用VSCode开发的官方文档 Welcome to the VS Code InterSystems ObjectScript documentation - InterSystems ObjectScript for VS Code (intersystems-community.github.io) 可以通过下面网址直接打开SOAP 向导页:
{serverurl}/isc/studio/templates/%25ZEN.Template.AddInWizard.SOAPWizard.cls?Namespace={namespace}
比如:http://localhost:52779/isc/studio/templates/%25ZEN.Template.AddInWizard.SOAPWizard.cls?Namespace=MyTest
也可以在VSCode里添加用户自定义的快捷键:
"objectscript.conn": {
"links": {
"Portal Explorer": "${serverUrl}/csp/sys/exp/%25CSP.UI.Portal.ClassList.zen?$NAMESPACE=${ns}",
"SOAP Wizard": "${serverUrl}/isc/studio/templates/%25ZEN.Template.AddInWizard.SOAPWizard.cls?$NAMESPACE=${ns}"
},
}
参考文档:https://intersystems-community.github.io/vscode-objectscript/configuration/#server-actions-menu
另:BPL,DTL一般直接在浏览器中进行编辑,完全不需要VSCode。 感谢 感谢 学到了