RHEL/CENTOS 7 ORACLE 19C-RAC安装(纯命令版)

一 首先需要安装两个CENTOS 7虚拟机(此处省略)。

由于我们是要安装ORCLE-RAC双节点集群所以至少每个CENTOS虚拟机上需要两块网卡,并且两块网卡都是HOST-ONLY具体步骤请看视频一《为虚拟机添加网卡》

这里大家需要注意的是,我们需要绑定两台机器的IP一共四个。

你要根据你自己设置的IP地址进行网卡IP设置,因为我只是演示环境,所以我就按照我的演示环境设置了,你要根据自己的真实环境来。

1号节点的主机名叫做ora19crac1 将 192.168.199.201和10.10.10.201绑定在这台机器的两块网卡上。

2号节点的主机名叫做ora19crac2 将 192.168.199.202和10.10.10.202并定在这台机器的两块网卡上。

我建议你使用以下IP:

RAC1 公有IP:192.168.100.201 私有IP 10.10.10.201

RAC2 公有IP:192.168.100.202 私有IP 10.10.10.202

所有IP对应的NETMASK(子网掩码)都是255.255.255.0

VIP(rac1-vip/rac2-vip)和SCANIP(rac-scan) 不需要你去处理,集群启动后会自动生成。

10.10.10.x这个网段你可以在宿主机上配置,也可以不配置看你心情。

编辑这两个虚拟机的/etc/hosts文件,把以下内容追加到/etc/hosts文件中

vi /etc/hosts

#RAC-PUBLIC-IP

192.168.199.201 ora19crac1

192.168.199.202 ora19crac2

#RAC-PRIVATE-IP

10.10.10.201 ora19crac1-priv

10.10.10.202 ora19crac2-priv

#RAC-VIP

192.168.199.101 ora19crac1-vip

192.168.199.102 ora19crac2-vip

#RAC-SCAN-IP

192.168.199.200 ora19crac-scan

关闭防火墙(RAC集群必须彻底关闭防火墙以防万一):

关闭防火墙

检查防火墙状态

systemctl status firewalld.service

暂时关闭防火墙,下次启动时防火墙仍随系统启动而启动

systemctl stop firewalld.service

彻底永久关闭防火墙

systemctl disable firewalld.service

关闭SELINUX防火墙!

vi /etc/selinux/config

将内容

SELINUX=enforcing

更改为

SELINUX=disabled

或者使用

sed 's#SELINUX=.*#SELINUX=disabled#' /etc/selinux/config

注:上面的命令是无法修改原文件内容的,只是去验证我们的命令是否正确,如果想要正式修改文件内容的话,请使用下面的命令:

sed -i 's#SELINUX=.*#SELINUX=disabled#' /etc/selinux/config (彻底的关闭SELINUX)

二 配置先决条件的yum源(先在RAC1这个节点上配置)

a 挂载光盘镜像

注:在虚拟机挂载光盘镜像以后,务必使用某个用户进入到虚拟机LINUX下看到桌面弹出小光盘为止(图形界面)

b 进入到光盘镜像中的Package目录中将所有的软件包复制到我们预设的目录下

mkdir /yums

CENTOS6/RHEL6 镜像挂载地点

cd /media/CentOS_6.6_Final/Packages/

cp * /yums

CENTOS7/RHEL7 镜像挂载地点

/run/media/root/CentOS 7 x86_64/Packages

CENTOS 7(这个目前适用于CENTOS7.4以及以下版本,如果你使用的是高版本的话,请自己注意具体包的名称,实在不知道就用tab键补全)

cd /yums

rpm -ivh deltarpm-3.6-3.el7.x86_64.rpm

rpm -ivh python-deltarpm-3.6-3.el7.x86_64.rpm

rpm -ivh createrepo-0.9.9-28.el7.noarch.rpm

createrepo .

进入到YUM源目录进行相关操作:

cd /etc/yum.repos.d/

rm -rf *

vi yum.local.repo

[local]

name=yum local repo

baseurl=file:///yums

gpgcheck=0

enable=1

生成yum源:

yum clean all

安装ftp(这里我们不在rac2这个虚拟机上再配置本地yum源了,我们是用一种新方法叫做:使用ftp的yum服务器)/当然了你如果不喜欢我的方法的话,你可以自己在另一个节点上再配置一次YUM源/

当然了,如果你觉得本地YUM源保险的话,依旧可以使用本地yum源没问题的。

知识点补充:FTP是一种文件传输协议,他可以传输文件。非常好用,他被经常用作我们进行相关文件传送使用。

yum install -y ftp* vsftpd*

安装好后,请执行以下操作:

cd /etc/vsftpd

vi ftpusers

然后把root用户注销掉。

修改好后保存退出

vi user_list

然后把root用户注销掉。

修改好后保存退出

vi vsftpd.conf

把下面这两个配置项前的#去掉。(在vi命令格式下使用set nu就能查看行号,这两行在82和83行)

#ascii_upload_enable=YES

#ascii_download_enable=YES

修改为

ascii_upload_enable=YES

ascii_download_enable=YES

全部修改好后保存退出

vi /etc/passwd

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin (在第12行)

修改为

ftp:x:14:50:FTP User:/yums:/sbin/nologin

启动 vsftpd

service vsftpd start

如果service vsftpd start 报出问题的话用下面命令启动ftp

/bin/systemctl status vsftpd.service

chkconfig vsftpd on --开机自启动

如果外面能连接上这个ftp服务器就说明没什么太大问题了。重启你的虚拟机

然后配置rac2这个节点

cd /etc/yum.repos.d/

rm -rf *

vi yum.local.repo

[local]

name=yum local repo

baseurl=ftp://192.168.199.201/

gpgcheck=0

enable=1

yum clean all

测试一下

yum install gcc

如果有反应就说明你的yum服务器配置成功了

安装先决条件包(两个节点都要做):

yum install -y bc

yum install -y compat-libcap1*

yum install -y compat-libcap*

yum install -y binutils

yum install -y compat-libstdc++-33

yum install -y elfutils-libelf

yum install -y elfutils-libelf-devel

yum install -y gcc

yum install -y gcc-c++

yum install -y glibc-2.5

yum install -y glibc-common

yum install -y glibc-devel

yum install -y glibc-headers

yum install -y ksh libaio

yum install -y libaio-devel

yum install -y libgcc

yum install -y libstdc++

yum install -y libstdc++-devel

yum install -y make

yum install -y sysstat

yum install -y unixODBC

yum install -y unixODBC-devel

yum install -y binutils*

yum install -y compat-libstdc*

yum install -y elfutils-libelf*

yum install -y gcc*

yum install -y glibc*

yum install -y ksh*

yum install -y libaio*

yum install -y libgcc*

yum install -y libstdc*

yum install -y make*

yum install -y sysstat*

yum install -y libXp*

yum install -y glibc-kernheaders

yum install -y net-tools-*

yum install -y iscsi-initiator-utils

yum install -y udev

yum install -y xclock*

三 内核参数(两个节点都做)

vi /etc/sysctl.conf

kernel.shmmax = 277495689510912

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

net.core.rmem_default = 262144

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

net.core.wmem_max = 1048586

fs.file-max = 6815744

kernel.shmall = 67747971072

net.ipv4.tcp_max_tw_buckets = 6000

net.ipv4.ip_local_port_range = 9000 65500

net.ipv4.tcp_tw_recycle = 0

net.ipv4.tcp_tw_reuse = 1

#net.core.somaxconn = 262144

net.core.netdev_max_backlog = 262144

net.ipv4.tcp_max_orphans = 262144

net.ipv4.tcp_max_syn_backlog = 262144

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_fin_timeout = 1

net.ipv4.tcp_keepalive_time = 30

net.ipv4.tcp_keepalive_probes = 6

net.ipv4.tcp_keepalive_intvl = 5

net.ipv4.tcp_timestamps = 0

fs.aio-max-nr = 1048576

net.ipv4.conf.all.rp_filter = 2

net.ipv4.conf.default.rp_filter = 2

生成系统参数

sysctl -p

四.添加下列参数到/etc/security/limits.conf (两个节点都做)

vim /etc/security/limits.conf

oracle soft nofile 1024

oracle hard nofile 65536

oracle soft nproc 16384

oracle hard nproc 16384

oracle soft stack 10240

oracle hard stack 32768

oracle hard memlock 134217728

oracle soft memlock 134217728

grid soft nofile 1024

grid hard nofile 65536

grid soft nproc 16384

grid hard nproc 16384

grid soft stack 10240

grid hard stack 32768

grid hard memlock 134217728

grid soft memlock 134217728

五.添加下列条目到/etc/pam.d/login (两个节点都做)

vim /etc/pam.d/login

session required /lib/security/pam_limits.so

session required pam_limits.so

六.环境变量中添加下列语句(两个节点都做)

vim /etc/profile

if [ $USER = "oracle" ] || [ $USER = "grid" ]; then

if [ $SHELL = "/bin/ksh" ]; then

ulimit -p 16384

ulimit -n 65536

else

ulimit -u 16384 -n 65536

fi

fi

生成环境变量

source /etc/profile

七.创建文件目录和相应的用户(两个节点都做)

#在两个节点增加用户与组:

groupadd -g 601 oinstall

groupadd -g 602 dba

groupadd -g 603 oper

groupadd -g 604 backupdba

groupadd -g 605 dgdba

groupadd -g 606 kmdba

groupadd -g 607 asmdba

groupadd -g 608 asmoper

groupadd -g 609 asmadmin

useradd -u 601 -g oinstall -G asmadmin,asmdba,dba,asmoper grid

useradd -u 602 -g oinstall -G dba,backupdba,dgdba,kmdba,asmadmin,oper,asmdba oracle

我们用这种最安全的方法修改grid和oracle用户密码

passwd grid

passwd oracle

以root用户,创建Oracle Inventory 目录

mkdir -p /u01/app/oraInventory

chown -R grid:oinstall /u01/app/oraInventory

chmod -R 775 /u01/app/oraInventory

以root用户,创建GI HOME目录

mkdir -p /u01/app/grid

mkdir -p /u01/app/19c/grid

chown -R grid:oinstall /u01/app/grid

chmod -R 775 /u01/app/grid

chown -R grid:oinstall /u01/app/19c

chmod -R 775 /u01/app/19c/

以root用户,创建Oracle Base目录

mkdir -p /u01/app/oracle

mkdir /u01/app/oracle/cfgtoollogs

chown -R oracle:oinstall /u01/app/oracle

chmod -R 775 /u01/app/oracle

以root用户,创建Oracle RDBMS Home目录

mkdir -p /u01/app/oracle/product/19c/db_1

chown -R oracle:oinstall /u01/app/oracle/product/19c/db_1

chmod -R 775 /u01/app/oracle/product/19c/db_1

八.GRID用户好ORACLE用户添加环境变量

su - grid

#grid用户的环境变量如下:

vim ~/.bash_profile

PS1="[`whoami`@`hostname`:"'PWD\]'

export PS1

umask 022

export TMP=/tmp

export TMPDIR=$TMP

export ORACLE_SID=+ASM1

export ORACLE_TERM=xterm;

export ORACLE_BASE=/u01/app/grid

export ORACLE_HOME=/u01/app/19c/grid

export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"

export NLS_DATE_FORMAT="yyyy-mm-dd HH24:MI:SS"

export TNS_ADMIN=$ORACLE_HOME/network/admin

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export PATH=.:PATH:HOME/bin:$ORACLE_HOME/bin

export THREADS_FLAG=native

if [ $USER = "oracle" ] || [ $USER = "grid" ]; then

if [ $SHELL = "/bin/ksh" ];then

ulimit -p 16384

ulimit -n 65536

else

ulimit -u 16384 -n 65536

fi

umask 022

fi

alias sqlplus='rlwrap sqlplus'

alias rman='rlwrap asmcmd'

生成环境变量

source ~/.bash_profile

补充:两个节点的ORACLE_SID名称是不能一样的:

ora19crac1节点叫做+ASM1

ora19crac2节点叫做+ASM2

su - oracle

#oracle用户的环境变量如下:

vim ~/.bash_profile

PS1="[`whoami`@`hostname`:"'PWD\]'

export PS1

export TMP=/tmp

export TMPDIR=$TMP

export ORACLE_HOSTNAME=rac1

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=/u01/app/oracle/product/19c/db_1

export ORACLE_SID=orcl1

export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"

export NLS_DATE_FORMAT="yyyy-mm-dd HH24:MI:SS"

export TNS_ADMIN=$ORACLE_HOME/network/admin

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export PATH=.:PATH:HOME/bin:ORACLE_BASE/product/19c/db_1/bin:ORACLE_HOME/bin

export THREADS_FLAG=native;export THREADS_FLAG

if [ $USER = "oracle" ] || [ $USER = "grid" ]; then

if [ $SHELL = "/bin/ksh" ];then

ulimit -p 16384

ulimit -n 65536

else

ulimit -u 16384 -n 65536

fi

umask 022

fi

alias sqlplus='rlwrap sqlplus'

alias rman='rlwrap rman'

生成环境变量

source ~/.bash_profile

补充:两个节点的ORACLE_SID名称是不能一样的:

ora19crac1节点叫做orcl1

ora19crac2节点叫做orcl2

如果你实例名不是orcl的话,那么请务必根据你的实例名改成xxxx1 xxxx2这样的格式。(xxxx代表你起的实例名)

九.配置ISCSI挂载外部存储

yum install -y iscsi*

开机启动iscsi服务

chkconfig iscsid on

发现磁盘

iscsiadm -m discovery -t sendtargets -p 192.168.199.235

手动登录目标(这里一定要注意 -T后面那个参数一定要按照你上面发现磁盘的那个结果进行更改)

iscsiadm -m node -T iqn.oracle19c.rac -p 192.168.199.235 -l

设置开机自启动连接

iscsiadm -m node -T iqn.oracle19c.rac -p 192.168.199.235 --op update -n node.startup -v automatic

查看

cd /dev/disk/by-path

ls -l /dev/disk/by-path/*iscsi* | awk '{FS=" "; print $9 " " $10 " " $11}'

检查磁盘的wwid

#!/bin/bash

for i in $(ls /dev/sd*|grep -v [0-9]|grep -v sda)

do

echo -ne "$(fdisk -l ${i}|grep ^Disk|grep ${i}|awk '{print $1,$2,$3,$4}') WWID:"

/lib/udev/scsi_id -g -u -d "${i}"

done|sort -nk3 -k5|column -t

输出结果:

Disk /dev/sde: 42.9 GB, WWID:14f504e46494c455267414a304a6b2d413653352d72653050

Disk /dev/sdf: 57.1 GB, WWID:14f504e46494c45525561634a51752d696d4b4c2d36576751

Disk /dev/sdb: 2147 MB, WWID:14f504e46494c4552774b6158696f2d5a7031692d35364e38

Disk /dev/sdc: 2147 MB, WWID:14f504e46494c4552555a6d3570652d506d56482d4b357167

Disk /dev/sdd: 2147 MB, WWID:14f504e46494c4552466d724d626f2d456b42732d7558575a

方法一(极端推荐)

vi /etc/udev/rules.d/99-oracle-asmdevices.rules

KERNEL=="sd*", ENV{ID_SERIAL}=="14f504e46494c455267414a304a6b2d413653352d72653050", SYMLINK+="asm_data", OWNER="grid", GROUP="asmadmin", MODE="0660"

KERNEL=="sd*", ENV{ID_SERIAL}=="14f504e46494c45525561634a51752d696d4b4c2d36576751", SYMLINK+="asm_bak", OWNER="grid", GROUP="asmadmin", MODE="0660"

KERNEL=="sd*", ENV{ID_SERIAL}=="14f504e46494c4552774b6158696f2d5a7031692d35364e38", SYMLINK+="asm_ocr_1", OWNER="grid", GROUP="asmadmin", MODE="0660"

KERNEL=="sd*", ENV{ID_SERIAL}=="14f504e46494c4552555a6d3570652d506d56482d4b357167", SYMLINK+="asm_ocr_2", OWNER="grid", GROUP="asmadmin", MODE="0660"

KERNEL=="sd*", ENV{ID_SERIAL}=="14f504e46494c4552466d724d626f2d456b42732d7558575a", SYMLINK+="asm_ocr_3", OWNER="grid", GROUP="asmadmin", MODE="0660"

方法二 (实验环境可以 生产不建议你这么玩)

vi /etc/udev/rule.d/60-raw.rules

ACTION=="add", KERNEL=="sdb", RUN+="/bin/raw /dev/raw/raw1 %N"

ACTION=="add", KERNEL=="sdc", RUN+="/bin/raw /dev/raw/raw2 %N"

ACTION=="add", KERNEL=="sdd", RUN+="/bin/raw /dev/raw/raw3 %N"

ACTION=="add", KERNEL=="sde", RUN+="/bin/raw /dev/raw/raw4 %N"

ACTION=="add", KERNEL=="sdf", RUN+="/bin/raw /dev/raw/raw5 %N"

ACTION=="add", KERNEL=="raw[1-5]",OWNER="grid",GROUP="oinstall",MODE="660"

使用以下命令是udev生效

udevadm control --reload-rules

udevadm trigger

个人建议:如果上述文件配置完成或者要执行添加或者删除磁盘任务,编辑文件结束后最好重新启动系统。但是还是要看实际情况

九 上传软件 解压 并赋权

sshUserSetup.sh

cvuqdisk-1.0.10-1.rpm

kmod-20-21.el7.x86_64.rpm

kmod-libs-20-21.el7.x86_64.rpm

compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm

rlwrap-0.37-1.el6.x86_64.rpm

上传到rac1的/root下

互信

sh sshUserSetup.sh -user root -hosts "ora19crac1 ora19crac2" -advanced -noPromptPassphrase #有的公司不允许root用户互信的

sh sshUserSetup.sh -user grid -hosts "ora19crac1 ora19crac2" -advanced -noPromptPassphrase

sh sshUserSetup.sh -user oracle -hosts "ora19crac1 ora19crac2" -advanced -noPromptPassphrase

使用root 、oracle和grid用户测试互信是否成功:

ssh ora19crac1 date

ssh ora19crac2 date

将文件从ora19crac1传输到ora19crac2上(root用户)

scp /root/cvuqdisk-1.0.10-1.rpm ora19crac2:/root

scp /root/kmod-20-21.el7.x86_64.rpm ora19crac2:/root

scp /root/kmod-libs-20-21.el7.x86_64.rpm ora19crac2:/root

scp /root/compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm ora19crac2:/root

scp /root/rlwrap-0.37-1.el6.x86_64.rpm ora19crac2:/root

用root用户安装 (两个节点)

cd /root (必须在/root这个目录下)

rpm -ivh cvuqdisk-1.0.10-1.rpm

rpm -ivh rlwrap-0.37-1.el6.x86_64.rpm

yum install -y compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm

yum install -y kmod-20-21.el7.x86_64.rpm

yum install -y kmod-libs-20-21.el7.x86_64.rpm

oracle官方建议关闭透明大页 (两个节点)

1 修改grub文件

cp /etc/default/grub /etc/default/grub.bak

vi /etc/default/grub

2 增加一行transparent_hugepage=never到尾部

GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet transparent_hugepage=never"

3 执行命令

grub2-mkconfig -o /boot/grub2/grub.cfg

4 不重启生效

echo never > /sys/kernel/mm/transparent_hugepage/enabled

5 查看是否禁用透明大页

cat /sys/kernel/mm/transparent_hugepage/enabled

always madvise [never]

grep AnonHugePages /proc/meminfo

AnonHugePages: 0 kB---------->>>返回值若是零代表关闭

建议重新启动。我试过了 好像不重启不行

以下所有操作都在ora19crac1上执行

用root用户把LINUX.X64_193000_grid_home.zip上传到/u01/app/19c/grid目录下

cd /u01/app/19c/grid

chown -R grid:oinstall LINUX.X64_193000_grid_home.zip

切换到grid用户并解压

su - grid

cd $ORACLE_HOME

unzip LINUX.X64_193000_grid_home.zip

export DISPLAY=xxxxxxx(按自己真实的写)

./gridSetup.sh

截图都在《19CRAC安装文档截图版.docx》

#########################################################

grid软件安装完成以后,我们开始安装database软件。

用root用户把database软件的压缩包LINUX.X64_193000_db_home.zip上传到/u01/app/oracle/product/19c/db_1

cd /u01/app/oracle/product/19c/db_1

chown -R oracle:oinstall LINUX.X64_193000_db_home.zip

切换到oracle用户并解压

su - oracle

cd $ORACLE_HOME

unzip LINUX.X64_193000_db_home.zip

export DISPLAY=xxxxxxx(按自己真实的写)

./runInstaller

截图都在《19CRAC安装文档截图版.docx》

十 卸载软件

rm -rf /u01/app/19c/grid/*

rm -rf /u01/app/grid/*

rm -rf /u01/app/oraInventory/*

rm -rf /u01/app/oracle/product/19c/db_1/*

rm -rf /etc/ora*

rm -rf /tmp/.oracle

rm -rf /tmp/OraInstall*

rm -rf /opt/ORCLfmap

rm -rf /var/tmp/.orac*

rm -rf /usr/local/bin/oraenv

rm -rf /usr/local/bin/coraenv

如果你有ASM的话,需要使用这种方式格式化

dd if=/dev/zero of=/dev/sdb bs=1M count=1024

dd if=/dev/zero of=/dev/sdc bs=1M count=1024

dd if=/dev/zero of=/dev/sdd bs=1M count=1024

dd if=/dev/zero of=/dev/sde bs=1M count=1024

dd if=/dev/zero of=/dev/sdf bs=1M count=1024

dd if=/dev/zero of=/dev/sdg bs=1M count=1024

dd if=/dev/zero of=/dev/sdh bs=1M count=1024

dd if=/dev/zero of=/dev/sdi bs=1M count=1024

dd if=/dev/zero of=/dev/sdj bs=1M count=1024

dd if=/dev/zero of=/dev/sdk bs=1M count=1024

dd if=/dev/zero of=/dev/sdl bs=1M count=1024

dd if=/dev/zero of=/dev/sdm bs=1M count=1024

dd if=/dev/zero of=/dev/sdn bs=1M count=1024

这个省略掉。

blacklist {

devnode "^sd[b-e]" #过滤磁盘,哪些不做多路径

}

defaults {

user_friendly_names yes

path_grouping_policy multibus

failback immediate

no_path_retry fail

}

service multipathd.service start

/sbin/iscsiadm -m node -T iqn.3960-05.storos.t-11 -p 192.168.10.250 -l

/sbin/iscsiadm -m node -T iqn.3960-05.storos.t-12 -p 192.168.10.250 -l

/sbin/iscsiadm -m node -T iqn.3960-05.storos.t-13 -p 192.168.10.250 -l

/sbin/iscsiadm -m node -T iqn.3960-05.storos.t-14 -p 192.168.10.250 -l

/sbin/iscsiadm -m node -T iqn.3960-05.storos.t-15 -p 192.168.10.250 -l

29335

/

相关推荐
Desmend__几秒前
正则表达式那些事儿
数据库·mysql·正则表达式
袁庭新17 分钟前
LuaRocks如何安装数据库驱动?
java·数据库·redis·lua·luarocks·袁庭新
Narutolxy28 分钟前
从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化20241112
数据库
chusheng184029 分钟前
Python 正则表达式进阶用法:分组与引用详解
数据库·python·正则表达式
编程墨客38 分钟前
第03章 文件编程
linux·运维·服务器
命里有定数42 分钟前
windows工具 -- 使用rustdesk和云服务器自建远程桌面服务, 手机, PC, Mac, Linux远程桌面 (简洁明了)
linux·运维·服务器·windows·ubuntu·远程工作
cleveryuoyuo1 小时前
进程的程序替换exec*函数和shell实现
linux·服务器
微凉的衣柜1 小时前
使用 VS Code 远程连接时解决 OpenSSL 版本不匹配及权限问题
服务器·vscode·ubuntu
喵叔哟1 小时前
重构代码之移动字段
java·数据库·重构
念白4431 小时前
智能病历xml提取
数据库·sql·oracle