暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

【江月】达梦8单机一键部署脚本

原创 春江花月夜 2024-12-05
440

说明

下载好安装包放到服务器上
注意目录的空间容量要足够解压安装包
根据需要自定义修改必填参数项
使用root执行脚本

一键部署脚本

#create by lhq
#version:v1.5
#for dm8 redhat 7+

#更新日志
#v1.0 20241204发布版本
#v1.1 20241205加入操作系统参数校验逻辑
#v1.2 20241206加入免密登录配置逻辑
#v1.3 20241209增加disql命令栏加强功能;修改创建库字符集默认为utf8,调整profile密码策略不过期
#v1.4 20241215增加install_type控制 安装全部/安装app/安装客户端;创建其他常用目录 dmbak dmdmp dmarc
#v1.5 20241219增加单独部署实例功能(DM_INSTALL_TYPE=3选项),以支持在已有实例的服务器上,新建其他实例

#-----------------------------------------------------------------------------
#入参必填项
DM_INSTALL_TYPE=0                #取值范围:0、1、2、3 (0表示安装全部 ## 1表示安装服务器 ## 2表示安装客户端 ## 3表示只新装实例)
DM_INSTALLZIP=/software/dm8_20240920_x86_rh7_64.zip           #填写上传的安装包全路径名
IP_ADDRESS=192.168.100.151
DM_DIRROOT=/DM8
DM_INSTALL_PATCH=${DM_DIRROOT}/dmapp
DM_DATA=${DM_DIRROOT}/dmdata
DM_PORT=5236                     #默认5236
DB_NAME=dmtest                   #默认DAMENG
INSTANCE_NAME=dmtest             #默认DMSERVER
SYSPASSWD=lhq#123456             #默认SYSDBA 如果自定义需要9到48位 字母符号数据
DM_OSUSER=dmdba                  #默认dmdba
DM_OSINSTALL=dmdba               #默认dmdba
DM_OSUSERPWD=dmdba               #默认和DM_OSUSER一样

#入参可选项
time=`date +"%Y%m%d%H%M%S"`
HOSTNAME=`hostname`
DMDB_XML=/tmp/DM_${INSTANCE_NAME}_${time}.xml
DMISOMNT=/dmiso
DMBAK=${DM_DIRROOT}/dmbak
DMDMP=${DM_DIRROOT}/dmdmp
DMARC=${DM_DIRROOT}/dmarc

#-----------------------------------------------------------------------------
if [ -z "${SYSPASSWD}" ]
then
    SYSPASSWD=SYSDBA
fi
if [ -z "${INSTANCE_NAME}" ]
then
    INSTANCE_NAME=DMSERVER
fi
if [ -z "${DM_PORT}" ]
then
    DM_PORT=5236
fi
if [ -z "${DM_OSUSER}" ]
then
    DM_OSUSER=dmdba
fi
if [ -z "${DM_OSINSTALL}" ]
then
    DM_OSINSTALL=dmdba
fi
if [ -z "${DM_OSUSERPWD}" ]
then
    DM_OSUSERPWD=dmdba
fi
if [ -z "$DB_NAME" ]
then
    DB_NAME=DAMENG
fi

#-----------------------------------------------------------------------------
#校验参数
echo
echo "校验参数"
executeUser=`whoami`
if [[ ${executeUser} != "root" ]]
then  
    echo "请使用root用户执行本脚本"  
    exit 1 
fi

IP_VALID_CHECK=$(echo $IP_ADDRESS|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
if echo $IP_ADDRESS|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null
then
    if [ "$IP_VALID_CHECK" == "yes" ] 
    then
        ip_exist=`ip a | grep "${IP_ADDRESS}"`
        if [ $? -ne 0 ]
        then
            echo "IP_ADDRESS:[IP_ADDRESS]不存在本机,请检查确认"
            exit 6
        fi
    else
        echo "IP:$IP_ADDRESS不可用"
        exit 6
    fi
else
    echo "IP:$IP_ADDRESS不可用"
    exit 6
fi

if [ $DM_INSTALL_TYPE -lt 3 ]
then
    if [ -f $DM_INSTALLZIP ]
    then
        echo "安装包为: $DM_INSTALLZIP"
    else
        echo "指定的安装包${DM_INSTALLZIP}不存在"
        exit 6
    fi
    
    if [ ! -d $DM_INSTALL_PATCH ]
    then
        echo "安装路径为: $DM_INSTALL_PATCH"
    else
        echo "安装路径${DM_INSTALL_PATCH}目录已存在"
        exit 6
    fi
    
    if [ ! -d $DM_DATA ]
    then
        echo "文件存放路径为: $DM_DATA"
    else
        echo "数据文件路径${DM_DATA}目录已存在"
        exit 6
    fi
elif [ $DM_INSTALL_TYPE -eq 3 ]
then
    if [ ! -f $DM_INSTALL_PATCH/uninstall.sh ]
    then
        echo "在${DM_INSTALL_PATCH}里没有找到DM软件,请确认是否已安装DM"
        exit 6        
    fi
    if [ -d ${DM_DATA}/$DB_NAME ]
    then
        if [ "$DB_NAME" != DAMENG ]
            then
            echo "数据库DB_NAME[${DB_NAME}]已存在当前服务器,请检查入参"
            exit 6
        fi
    fi
    if [ -f ${DM_INSTALL_PATCH}/bin/DmService$INSTANCE_NAME ]
    then
        echo "数据库INSTANCE_NAME[${INSTANCE_NAME}]已存在当前服务器,请检查入参"
        exit 6
    fi  
else
    echo "参数DM_INSTALL_TYPE数字不对,请重新填写。取值范围:0、1、2、3 (0表示安装全部 ## 1表示安装服务器 ## 2表示安装客户端 ## 3表示只新装实例)"
    exit 6
fi

netstat -an | grep ${DM_PORT} &>/dev/null
if [ $? -eq 1 ]
then
    echo "数据库端口为: $DM_PORT"
else
    echo "数据库端${DM_PORT}已占用"
    exit 6
fi

 
#-----------------------------------------------------------------------------
#开始执行
echo
if [ $DM_INSTALL_TYPE -lt 3 ]
then
echo "开始干活"
echo "0.解压安装包"
DM_ISO=`echo \`echo $DM_INSTALLZIP | awk -F '.zip' '{print $1}'\`.iso`
if [ -f $DM_ISO ]
then
    echo "达梦安装介质为: $DM_ISO"
else
ZIP_DIR=`dirname $DM_INSTALLZIP`
cd $ZIP_DIR
unzip $DM_INSTALLZIP
echo "达梦安装介质为: $DM_ISO"
fi

echo "1.关闭防火墙、selinux、透明大页、RemoveIPC"
systemctl stop firewalld && systemctl disable firewalld
iptables -F
sed -i "/^SELINUX=/s#enforcing#disabled#" /etc/selinux/config
sed -i 's/#RemoveIPC=no/RemoveIPC=no/' /etc/systemd/logind.conf
systemctl daemon-reload &>/dev/null
systemctl restart systemd-logind &>/dev/null
cat /etc/default/grub | grep transparent_hugepage=never | grep -v '^#'  &>/dev/null
if [ $? -eq 1 ]
then
sed -i 's/quiet/quiet transparent_hugepage=never numa=off/' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg &>/dev/null
fi


echo "2.禁用ipv6"
cat /etc/sysconfig/network | grep NETWORKING_IPV6=no &>/dev/null
if [ $? -eq 1 ]
then
    echo "NETWORKING_IPV6=no" >> /etc/sysconfig/network
fi
sed -i 's#^NETWORKING_IPV6=.*$#NETWORKING_IPV6=no#' /etc/sysconfig/network
cat > /etc/modprobe.d/ipv6off.conf<<EOF
alias net-pf-10 off
options ipv6 disable=1
EOF

echo "3.创建用户"
id "$DM_OSUSER" &>/dev/null
if [ $? -ne 0 ]
then
    /usr/sbin/groupadd -g 5001 $DM_OSINSTALL
    /usr/sbin/useradd -g $DM_OSINSTALL -s /bin/bash -u 5001 $DM_OSUSER
    echo ${DM_OSUSERPWD}|passwd --stdin $DM_OSUSER
fi

echo "4.mount dmiso"
df -h | grep $DMISOMNT &>/dev/null
if [ $? -eq 1 ]
then
    mkdir -p $DMISOMNT
    mount $DM_ISO $DMISOMNT &>/dev/null
fi

echo "5.增加/etc/hosts信息"
cat /etc/hosts | grep -v '^#' | grep $IP_ADDRESS | grep $HOSTNAME &>/dev/null
if [ $? -eq 1 ]
then
    echo "$IP_ADDRESS $HOSTNAME" >> /etc/hosts
fi

echo "6.修改操作系统内核参数"
cat /etc/sysctl.conf | grep 'add by dm' &>/dev/null
if [ $? -eq 1 ]
then
cat >> /etc/sysctl.conf <<EOF
#########add by dm $time dmbegin#########
kernel.shmall = 4294967296
kernel.sem = 5130 65280 510 256
kernel.shmmni = 4096
kernel.shmmax = 549755813888
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 1048576
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
fs.file-max = 6815744
fs.aio-max-nr = 1048576
vm.swappiness = 10
vm.dirty_background_ratio = 20
vm.dirty_ratio = 80
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.tcp_wmem = 262144
net.ipv4.tcp_rmem = 4194304
vm.overcommit_memory=0
kernel.core_pattern=/var/log/dm/core/
#########add by dm $time dmend#########
EOF
/sbin/sysctl -p &>/dev/null
fi


cat /etc/pam.d/login | grep 'add by dm' | grep pam_limits &>/dev/null
if [ $? -eq 1 ]
then
cat  >> /etc/pam.d/login <<EOF
#########add by dm $time dmbegin#########
session    required     /lib64/security/pam_limits.so
session    required     pam_limits.so
#########add by dm $time dmend#########
EOF
fi

cat /etc/systemd/system.conf | grep 'add by dm' &>/dev/null
if [ $? -eq 1 ]
then
cat >> /etc/systemd/system.conf <<EOF
#########add by dm $time dmbegin#########
DefaultLimitCORE=infinity
DefaultLimitNOFILE=65536
DefaultLimitNPROC=10240
#########add by dm $time dmend#########
EOF
fi

cat > /etc/security/limits.d/dm_nproc.conf <<EOF
$DM_OSUSER soft nproc 65536
$DM_OSUSER hard nproc 65536
EOF


echo "7.修改limits" 
cat /etc/security/limits.conf | grep 'add by dm' &>/dev/null
if [ $? -eq 1 ]
then
cat >> /etc/security/limits.conf <<EOF
#########add by dm $time dmbegin#########
* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536
$DM_OSUSER          soft    nice     65536
$DM_OSUSER          hard    nice     65536
$DM_OSUSER          soft    as       unlimited
$DM_OSUSER          hard    as       unlimited
$DM_OSUSER          soft    fsize    unlimited
$DM_OSUSER          hard    fsize    unlimited
$DM_OSUSER          soft    nproc    65536
$DM_OSUSER          hard    nproc    65536
$DM_OSUSER          soft    nofile   65536
$DM_OSUSER          hard    nofile   65536
$DM_OSUSER          soft    core     unlimited
$DM_OSUSER          hard    core     unlimited
$DM_OSUSER          soft    data     unlimited
$DM_OSUSER          hard    data     unlimited
#########add by dm $time dmend#########
EOF
fi

echo "8.修改环境变量"
cat /home/$DM_OSUSER/.bash_profile | grep 'add by dm' &>/dev/null
if [ $? -eq 1 ]
then
cat >> /home/$DM_OSUSER/.bash_profile <<EOF
#########add by dm $time dmbegin#########
export DM_HOME=$DM_INSTALL_PATCH
export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\$DM_HOME/bin
export PATH=\$DM_HOME/bin:\$DM_HOME/tool:/usr/sbin:\$PATH
alias dmbin="cd $DM_HOME/bin"
alias dmlog="cd $DM_HOME/log"
alias ds='disql / as sysdba'
#alias ds5237='disql /:5237 as sysdba'
#alias dsql="disql -S /:5236 as sysdba -C \\"set linesize 999 pagesize 999 long 1000 feed off\\" -E"
#########add by dm $time dmend#########
EOF
fi


echo "9.创建INSTALL配置文件"
if [ $DM_INSTALL_TYPE -eq 0 ]
then
    DM_INIT_DB=y
else
    DM_INIT_DB=n
fi

cat > ${DMDB_XML} <<EOF
<?xml version="1.0"?>
<DATABASE>
    <!--安装数据库的语言配置,简体中文版: ZH,繁体中文版: CHT,英文版: EN,不区分大小写。不允许为空。 -->
    <LANGUAGE>ZH</LANGUAGE>
    <!--安装程序的时区配置,缺省为+08:00,取值范围:-12:59 ~ +14:00 -->
    <TIME_ZONE>+08:00</TIME_ZONE>
    <!-- key文件路径 -->
    <KEY></KEY>
    <!--安装程序组件类型,取值范围:0、1、2,0 表示安装全部,1 表示安装服务器,2 表示安装客户端。缺省为0。 -->
    <INSTALL_TYPE>${DM_INSTALL_TYPE}</INSTALL_TYPE>
    <!--安装路径,不允许为空。合法的安装路径允许字符的范围是小写字母(a-z)、大写字母(A-Z)、数字(0-9)、下划线(_)、空格( )和中文。 -->
    <INSTALL_PATH>${DM_INSTALL_PATCH}</INSTALL_PATH>
    <!--是否初始化库,取值范围:Y/N、y/n,不允许为空。 -->
    <INIT_DB>${DM_INIT_DB}</INIT_DB>
    <!--数据库实例参数 -->
    <DB_PARAMS>
        <!--初始数据库存放的路径,不允许为空 -->
        <PATH>${DM_DATA}</PATH>
        <!--初始化数据库名字,缺省为DAMENG,不超过128个字符 -->
        <DB_NAME>${DB_NAME}</DB_NAME>
        <!--初始化数据库实例名字,缺省为DMSERVER,不超过128个字符 -->
        <INSTANCE_NAME>${INSTANCE_NAME}</INSTANCE_NAME>
        <!--初始化时设置dm.ini中的PORT_NUM,缺省为5236,取值范围:1024~65534 -->
        <PORT_NUM>${DM_PORT}</PORT_NUM>
        <!--初始数据库控制文件的路径,文件路径长度最大为256 -->
        <CTL_PATH></CTL_PATH>
        <!--初始化数据库日志文件的路径,文件路径长度最大为256,LOG_PATH值为空则使用缺省值,如果使用非默认值LOG_PATH节点数不能少于2个 -->
        <LOG_PATHS>
            <LOG_PATH>
            </LOG_PATH>
        </LOG_PATHS>
        <!--数据文件使用的簇大小,取值范围:16页、32页,缺省为16页 -->
        <EXTENT_SIZE>16</EXTENT_SIZE>
        <!--数据文件使用的页大小,取值范围:4K、8K、16K、32K,缺省为8K -->
        <PAGE_SIZE>8</PAGE_SIZE>
        <!--日志文件使用的簇大小,缺省为256,取值范围为64~2048之间的整数 -->
        <LOG_SIZE>256</LOG_SIZE>
        <!--大小写敏感。取值范围:Y/N y/n 1/0,缺省为Y -->
        <CASE_SENSITIVE>Y</CASE_SENSITIVE>
        <!--字符集选项,缺省为0。0代表GB18030,1代表UTF-8,2代表韩文字符集EUC-KR -->
        <CHARSET>1</CHARSET>
        <!--字符类型在计算HASH值时所采用的HASH算法类别。取值范围0,1。0:原始HASH算法;1:改进的HASH算法。缺省为1。 -->
        <USE_NEW_HASH>1</USE_NEW_HASH>
        <!--初始化时设置SYSDBA的密码,缺省为SYSDBA,长度在9到48个字符之间 -->
        <SYSDBA_PWD>${SYSPASSWD}</SYSDBA_PWD>
        <!--初始化时设置SYSAUDITOR的密码,缺省为SYSAUDITOR,长度在9到48个字符之间 -->
        <SYSAUDITOR_PWD></SYSAUDITOR_PWD>
        <!--初始化时设置SYSSSO的密码,缺省为SYSSSO,长度在9到48个字符之间,仅在安全版本下可见和可设置 -->
        <SYSSSO_PWD></SYSSSO_PWD>
        <!--初始化时设置SYSDBO的密码,缺省为SYSDBO,长度在9到48个字符之间,仅在安全版本下可见和可设置 -->
        <SYSDBO_PWD></SYSDBO_PWD>
        <!--初始化时区,默认是东八区。格式为:正负号小时:分钟,取值范围:-12:59 ~ +14:00 -->
        <TIME_ZONE>+08:00</TIME_ZONE>
        <!--是否启用页面内容校验,取值范围:0,1,2。0:不启用;1:简单校验;2:严格校验(使用CRC16算法生成校验码)。缺省为0 -->
        <PAGE_CHECK>0</PAGE_CHECK>
        <!--设置默认加密算法,不超过128个字符 -->
        <EXTERNAL_CIPHER_NAME></EXTERNAL_CIPHER_NAME>
        <!--设置默认HASH算法,不超过128个字符 -->
        <EXTERNAL_HASH_NAME></EXTERNAL_HASH_NAME>
        <!--设置根密钥加密引擎,不超过128个字符 -->
        <EXTERNAL_CRYPTO_NAME></EXTERNAL_CRYPTO_NAME>
        <!--全库加密密钥使用的算法名。算法可以是DM内部支持的加密算法,或者是第三方的加密算法。默认使用"AES256_ECB"算法加密,最长为128个字节 -->
        <ENCRYPT_NAME></ENCRYPT_NAME>
        <!--用于加密服务器根密钥,最长为48个字节 -->
        <USBKEY_PIN></USBKEY_PIN>
        <!--设置空格填充模式,取值范围:0,1,缺省为0 -->
        <BLANK_PAD_MODE>0</BLANK_PAD_MODE>
        <!--指定system.dbf文件的镜像路径,缺省值为空 -->
        <SYSTEM_MIRROR_PATH></SYSTEM_MIRROR_PATH>
        <!--指定main.dbf文件的镜像路径,缺省值为空 -->
        <MAIN_MIRROR_PATH></MAIN_MIRROR_PATH>
        <!--指定roll.dbf文件的镜像路径,缺省值为空 -->
        <ROLL_MIRROR_PATH></ROLL_MIRROR_PATH>
        <!--是否是四权分立,取值范围:0,1。0:不使用;1:使用。缺省为0。仅在安全版本下可见和可设置。 -->
        <PRIV_FLAG>0</PRIV_FLAG>
        <!--指定初始化过程中生成的日志文件所在路径。合法的路径,文件路径长度最大为257(含结束符),不包括文件名 -->
        <ELOG_PATH></ELOG_PATH>
    </DB_PARAMS>
    <!--是否创建数据库实例的服务,取值范围: Y/N y/n,不允许为空,不初始化数据库将忽略此节点。非root用户不能创建数据库服务。 -->
    <CREATE_DB_SERVICE>Y</CREATE_DB_SERVICE>
    <!--是否启动数据库,取值范围: Y/N y/n,不允许为空,不创建数据库服务将忽略此节点。 -->
    <STARTUP_DB_SERVICE>Y</STARTUP_DB_SERVICE>
</DATABASE>
EOF

if [ -f "${DMDB_XML}" ]
then
    echo "初始化配置文件已经创建成功"
else
    echo "初始化配置文件创建失败"
fi

echo "开始部署"
cd $DMISOMNT
./DMInstall.bin -q $DMDB_XML
sleep 5

elif [ $DM_INSTALL_TYPE -eq 3 ]
then
    [ ! -d ${DM_DATA} ] && mkdir -p ${DM_DATA} && chown dmdba:${DM_OSINSTALL} ${DM_DATA} && chmod 755 ${DM_DATA}
    su - dmdba -c "dminit PATH=${DM_DATA} DB_NAME=${DB_NAME} INSTANCE_NAME=${INSTANCE_NAME} PORT_NUM=${DM_PORT} SYSDBA_PWD=${SYSPASSWD} CHARSET=1"
    ${DM_INSTALL_PATCH}/script/root/dm_service_installer.sh -t dmserver -dm_ini ${DM_DATA}/${DB_NAME}/dm.ini -p ${INSTANCE_NAME}
    su - dmdba -c "DmService${INSTANCE_NAME} start"
    sleep 15
fi



if [ $DM_INSTALL_TYPE -eq 0 ] || [ $DM_INSTALL_TYPE -eq 3 ]
then
    if [ -n "{SYSPASSWD}" ]
    then
    LOGINCOM=`echo disql sysdba/\'\"${SYSPASSWD}\"\'@127.0.0.1:${DM_PORT}`
    else
    LOGINCOM=`echo disql sysdba/SYSDBA@127.0.0.1:${DM_PORT}`
    fi
    
    if [ ${DM_PORT} -eq 5236 ]
    then
        os_logincom=`echo disql / as sysdba`
    else
        os_logincom=`echo disql /:${DM_PORT} as sysdba`
        check_login_port=`cat /home/dmdba/.bash_profile | grep ${DM_PORT} | grep -v ^#`
        if [ $? -eq 1 ]
        then
            echo  "alias ds${DM_PORT}='disql /:${DM_PORT} as sysdba'" >> /home/dmdba/.bash_profile
        fi
    fi
    #免密登录
    su - dmdba -c "${LOGINCOM} -E \"SP_SET_PARA_VALUE (2,'ENABLE_LOCAL_OSAUTH',1);\""
    su - dmdba -c "DmService${INSTANCE_NAME} restart"
    su - dmdba -c "${LOGINCOM} -E \"ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;\""
    su - dmdba -c "${LOGINCOM} -E \"ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;\""
fi

cat > $DM_INSTALL_PATCH/bin/disql_conf/glogin.sql <<EOF
-- 显示密钥过期时间
column expired_date new_value _edate
select to_char(expired_date,'yyyy-mm-dd') expired_date from v\$license;
host echo "密钥过期时间 :&_edate"
-- 设置 dbms_output 输出缓冲区大小
set serveroutput on size 1000000
-- 设置输出格式
set long 200 linesize 500 pages 5000
-- 去除重定向输出每行拖尾空格
set trimspool on
-- 去除行号显示
set lineshow off
-- 显示当前连接信息
col name new_value _dname
select name from v\$instance;
col port_num new_value _port
select para_value port_num from v\$dm_ini where para_name='PORT_NUM';
set SQLPROMPT "_USER'@'_dname':'_port SQL> "
-- 显示当前时间
set time on
EOF

#创建其他目录
[ ! -d ${DMBAK} ] && mkdir -p ${DMBAK} && chown dmdba:${DM_OSINSTALL} ${DMBAK} && chmod 755 ${DMBAK}
[ ! -d ${DMDMP} ] && mkdir -p ${DMDMP} && chown dmdba:${DM_OSINSTALL} ${DMDMP} && chmod 755 ${DMDMP}
[ ! -d ${DMARC} ] && mkdir -p ${DMARC} && chown dmdba:${DM_OSINSTALL} ${DMARC} && chmod 755 ${DMARC}

cat /etc/group | grep :dmdba &>/dev/null
if [ $? -eq 1 ]
then
usermod -a -G dmdba dmdba &>/dev/null
fi

echo
echo
echo "数据库安装目录为: $DM_INSTALL_PATCH"  
echo "数据库文件存放为: $DM_DATA"
if [ $DM_INSTALL_TYPE -eq 0 ] || [ $DM_INSTALL_TYPE -eq 3 ]
then
echo "数据库名称为: $DB_NAME"
echo "切换到${DM_OSUSER}用户登录命令为: $LOGINCOM" 
echo "也可以使用免密登录命令: ${os_logincom}"
fi
echo
echo "全部完成"
最后修改时间:2024-12-20 22:37:52
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论