oracle10gRAC+OCFS2+LINUX安装完全手册

主机名:racnode1、racnode2
1、配置两台服务器的ip地址
racnode1的eth0为192.168.1.200,eth1为10.1.1.1
racnode2的eth0为192.168.1.201,eth1为10.1.1.2

2、配置两台服务器的/etc/hosts如下:
127.0.0.1   localhost   (必须要这样)
# Public Network - (eth0)
192.168.1.200   racnode1
192.168.1.201   racnode2
# Private Interconnect - (eth1)
10.1.1.1 racnode1-priv
10.1.1.2 racnode2-priv
# Public Virtual IP (VIP) addresses for - (eth0)
192.168.1.150 racnode1-vip
192.168.1.151 racnode2-vip

3、准备oracle安装的参数
3.1. 确保/etc/selinux/configure中的值如下
SELINUX=disabled
SELINUXTYPE=disabled      

3.2.修改系统参数
 vi /etc/sysctl.conf 增加如下参数
kernel.shmall = 2097152
kernel.shmmax = 1073741824
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default=262144
net.core.rmem_max=262144
net.core.wmem_default=262144
net.core.wmem_max=262144
运行下面命令使设置生效/sbin/sysctl -p

vi /etc/security/limits.conf 增加如下参数
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536

3.3、修改操作系统的版本
vi /etc/redhat-release
Red Hat Enterprise Linux Server release 5 (Tikanga) 替换成 redhat-4

3.4、安装系统缺失的包
确保如下包都有安装
      gcc-4.1.1-52.el5
      make-3.81-1.1
      binutils-2.17.50.0.6-2.el5
      openmotif
      setarch-2.0-1.1
      compat-db
      compat-gcc
      compat-gcc-c++
      compat-libstdc++
      compat-libstdc++-devel

如果没有安装请从光盘安装,由于缺失的包之间有严格的依赖关系,所以必须按照如下顺序安装缺失的包,redhat5上是否安装请参看如下:  
        rpm -ivh compat-db-4* (这个需要装)
        rpm -ivh compat-gcc-34-3* (这个需要装)
        rpm -ivh compat-gcc-34-c++-3* (这个需要装)
        rpm -ivh libXp-1* (这个需要装,其中包括32位的)
        rpm -ivh openmotif-2* (这个需要装)
        rpm -ivh compat-readline43-4.3-3.x86_64.rpm (这个需要装)
       
        rpm -ivh libaio-0*    (这个已装)
        rpm -ivh compat-libstdc++-33-3* (这个已装)
        rpm -ivh glibc-headers-2.5-12.i386.rpm (这个已装)
        rpm -ivh glibc-devel-2.5-12.i386.rpm (这个已装)
        rpm -ivh gcc-4* (这个已装)
        rpm -ivh glibc-2.5-12.i686.rpm (这个已装)
        rpm -ivh libgomp-4.1.1-52.el5.i386.rpm (这个已装)
        rpm -ivh gcc-4.1.1-52.el5.i386.rpm (这个已装)


如果安装完成后仍然提示部分包没有安装,不过不影响使用
package compat-gcc is not installed
package compat-gcc-c++ is not installed
package compat-libstdc++ is not installed
package compat-libstdc++-devel is not installed
 
3.5、添加oracle用户和组
groupadd oinstall
groupadd dba
useradd -m -g oinstall -G dba oracle

passwd oracle
为方便记忆,密码 就用oracle
 
3.6、 创建安装目录并赋予oracle相应权限
mkdir -p /u01/app/oracle/product/10.2.0/db_1
mkdir -p /u01/app/oracle/product/10.2.0/crs_1
chown -R oracle:oinstall /u01
chmod -R 775 /u01
 
3.7、设置oracle的环境变量
export DISPLAY="192.168.2.81:0.0"
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORA_CRS_HOME=$ORACLE_BASE/product/10.2.0/crs_1
export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH:$ORA_CRS_HOME/bin
export ORACLE_SID=rac1(另外一台机器用rac2做实例名)
export NLS_LANG="Simplified Chinese_China.UTF8"
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib
export ORACLE_TERM=xterm
export TMP=/tmp
export TMPDIR=$TMP
#export LD_ASSUME_KERNEL=2.6.9
export LANG=en_US.utf8
export LANGUAGE=en_US.utf8
export LC_ALL=en_US.utf8
umask 022

if [ $USER = "oracle" ]; then
  if [ $SHELL = "/bin/ksh" ]; then
    ulimit -p 16384
    ulimit -n 65536
  else
    ulimit -u 16384 -n 65536
  fi
fi
 
4、 为oracle用户配置等效性SSH(root用户可以不做)
mkdir ~/.ssh
chmod 755 ~/.ssh
/usr/bin/ssh-keygen -t rsa
/usr/bin/ssh-keygen -t dsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys1(racnode2上就为authorized_keys2)
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys1 (racnode2上就为authorized_keys2)
将生成的authorized_keys文件分别拷贝到对方的~/.ssh/目录下并分配如下权限
scp ~/.ssh/authorized_keys1 oracle@node2:~/.ssh/authorized_keys
scp ~/.ssh/authorized_keys2 oracle@node1:~/.ssh/authorized_keys
chmod 644 ~/.ssh/authorized_keys
最后在自己的.ssh中将authorized_keys1增加到authorized_keys中(两台机器都要做)
cat authorized_keys1>>authorized_keys
cat authorized_keys2>>authorized_keys
测试使用ssh是否不需要密码就可以成功登陆
在第一个主机上,以 oracle 用户身份登录
ssh racnode1
ssh racnode1-priv
ssh racnode2
ssh racnode2-priv
在第二个主机上,以 oracle 用户身份登录
ssh racnode2
ssh racnode2-priv
ssh racnode1
ssh racnode1-priv
以上操作必须都做,否则在安装clusterware的时候会报错!
建立用户等效性
exec /usr/bin/ssh-agent $SHELL
/usr/bin/ssh-add
验证是否正常
在racnode1上执行ssh 192.168.1.201 hostname
在racnode2上执行ssh 192.168.1.200 hostname
确定ForwardX11置为no
编辑或创建 vi ~/.ssh/config
内容如下:
Host *
      ForwardX11 no


5、配置 hangcheck-timer 内核模块(在所有节点上执行)
以root用户执行
确认是否安装 hangcheck-timer.ko 模块
find /lib/modules -name hangcheck-timer* -print
配置并加载 hangcheck-timer 模块
echo "/sbin/modprobe hangcheck-timer hangcheck_tick=30 hangcheck_margin=180 " >> /etc/rc.local
手动加载 Hangcheck 内核模块以进行测试
/sbin/modprobe hangcheck-timer hangcheck_tick=30 hangcheck_margin=180
grep Hangcheck /var/log/messages | tail -2 | more


6、规划阵列分区(在一台设备上执行就行)
fdisk /dev/sdb (用于votedisk和ocr)
fdisk /dev/sdc (用于数据库)
Syncing disks.在创建了所有必要分区后,现在应以 root 用户帐户使用以下语法将分区的更改情况通知给内核:
/sbin/partprobe
重新引导 RAC 集群中的所有节点
在创建分区后,建议您重新引导所有 RAC 节点上的内核,以确保所有 RAC 节点上的内核识别所有新分区。
reboot

7、2.13 安装和配置 OCFS2(在所有节点上执行)
rpm -ivh ocfs2-tools-1.4.4-1.el5.x86_64.rpm
rpm -ivh ocfs2-tools-devel-1.4.4-1.el5.x86_64.rpm
rpm -ivh ocfs2console-1.4.4-1.el5.x86_64.rpm
rpm -ivh ocfs2-2.6.18-164.el5-1.4.7-1.el5.x86_64.rpm

配置并加载 OCFS2
在所有节点上以root用户身份运行此工具:
/usr/sbin/ocfs2console

选择 [Clucster]-[Configure Nodes]
在“Node Configuration”对话框中,输入2个专用互连的节点名、IP地址、端口号。本示例将使用 racnode1和 10.1.1.1(私有ip)和7777 表示节点 1,
并使用 racnode2 和10.1.1.2(私有ip)和7777 表示节点2。验证所有节点上的所有值正确之后,请退出应用程序。

选择 [Clucster]-[Propagate Cluster Configuration] ,选择"yes"提示”Finished”。
配置完成后将获得一个/etc/ocfs2/cluster.conf配置文件。集群中的两个节点的 OCFS2 配置文件必须完全相同:

注意:节点一配置成功后,在配置节点二的时候节点名、IP地址、端口号是自动装载。在执行选择 [Clucster]-[Propagate Cluster Configuration]如果有报错,
请删除/etc/ocfs2/*.conf配置文件,再重新启动ocfs2console,执行以上的 [Clucster]-[Configure Nodes] 和[Clucster]-[Propagate Cluster Configuration] 。
配置完成后,在集群中的所有节点上以 root 用户帐户的身份运行以下命令
/etc/init.d/o2cb enable 使ocfs2可用,如果停用就用disable

O2CB 配置为在引导时启动,可以执行如下命令:
/etc/init.d/o2cb status 检查o2cb 服务的状态(发现Checking O2CB heartbeat: Not active O2CB 心跳当前没有活动,因为文件系统还没有挂载,挂载之后就会变成active  .)
/etc/init.d/o2cb offline ocfs2 使我们创建的集群 ocfs2 处于脱机状态
/etc/init.d/o2cb unload ocfs2 卸载所有 OCFS2 模块
/etc/init.d/o2cb configure  按y选择ocfs2后就行了

创建 OCFS 文件系统(在格式化和挂载文件系统之前,应验证 O2CB 在两个节点上 均联机/etc/init.d/o2cb status)该操作在一个节点上执行就可以
mkfs.ocfs2 -L "clusterfiles" /dev/sdb1
mkfs.ocfs2 -L "database" /dev/sdc1
mkdir -p /u02/oradata/orcl
chown -R oracle:dba /u02

使用命令行载入 OCFS 文件系统(在所有节点上以root用户执行)
载入crs/ocr所在分区的ocfs文件系统
mkdir -p /u02/oradata/orcl
mount -o datavolume,nointr -t ocfs2 /dev/sdb1 /u02/oradata/rac
chown -R oracle:dba /u02/
chmod -R 775 /u02

载入数据库所在分区的ocfs文件系统
mkdir -p /u01/app/oracle/oradata
mount  -o datavolume,nointr -t ocfs2 /dev/sdc1  /u01/app/oracle/oradata
chown -R oracle:dba   /u01/app/oracle/oradata
chmod -R 775 /u01/app/oracle/oradata

Oracle数据库用户在将Ocfs2挂接点用来存放voting disk(CRS),cluster registry(OCR),数据文件,redo file,归档日志和控制文件时,在mount操作时,
一定要使用’datavolume,nointr’ 的mount选项。
其中datavolume选项确保Oracle进程在打开文件时使用o_direct标记。nointr选项确保在这个设备上的读写不会被一些信号中断。其他的设备,比如用于
存放Oracle_Home文件的挂节点不需要使用这些选项。通过以下命令来完成包含数据文件,voting disk等设备的挂载:

将 OCFS 配置为在启动时自动载入
将下面命令增加到/etc/rc.local文件里面
mount -o datavolume,nointr -t ocfs2 /dev/sdb1 /u02/oradata/orcl
chown -R oracle:dba /u02/
chmod -R 775 /u02
mount  -o datavolume,nointr -t ocfs2 /dev/sdc1  /u01/app/oracle/oradata
chown -R oracle:dba   /u01/app/oracle/oradata
chmod -R 775 /u01/app/oracle/oradata

8、安装oracle clusterware 10g软件
安装前请执行如下操作
检查rsh-server包是否已经安装
[root@rac1 ~]# rpm -qa|grep -i ^rsh-server
rsh-server-0.17-40.el5
如果没有安装使用rpm -ivh 命令安装
确保/etc/xinetd.d/rlogin中存在disable = no这一行
确保/etc/xinetd.d/rsh中存在disable = no这一行
重启xinetd服务
 service xinetd restart

编辑/etc/securetty,增加rexec、rsh、rlogin三行

编辑/etc/hosts.equiv文件,如下所示
racnode1 oracle
racnode2 oracle
racnode1-priv oracle
racnode2-priv oracle
racnode1 root
racnode2 root
racnode1-priv root
racnode2-priv root

编辑root下的~/.rhosts,如下所示
+rac1 root
+rac2 root
+rac1-priv root
+rac2-priv root
编辑oracle下的~/.rhosts,如下所示
racnode1 oracle
racnode2 oracle
racnode1-priv oracle
racnode2-priv oracle

测试rlogin和rsh是否可以不用输入密码登录其他节点
rsh racnode1
rsh racnode2
以上操作如果不做,安装clusterware的时候会报错

仅在集群的一个节点上执行下列安装过程!Oracle CRS 软件将被 Oracle Universal Installer 安装到集群的所有其他节点。
取消 ORACLE_HOME 的设置
unset ORA_CRS_HOME
unset ORACLE_HOME
unset ORACLE_OWNER
unset ORA_NLS33
unset TNS_ADMIN
unset LIBPATH
unset LD_LIBRARY_PATH
核实 racnode1 上的环境变量
env | grep ORA
ORACLE_SID=rac1
ORACLE_BASE=/u01/app/oracle
ORACLE_TERM=xterm

核实 racnode2 上的环境变量
env | grep ORA
ORACLE_SID=rac2
ORACLE_BASE=/u01/app/oracle
ORACLE_TERM=xterm

gunzip  10201_clusterware_linux_x86_64.cpio.gz
cpio -idmv < 10201_clusterware_linux_x86_64.cpio
/home/oracle/clusterware/runInstaller
提示用root执行/home/oracle/clusterware/rootpre/rootpre.sh(两台机器上都执行)
下一步为增加节点成员
racnode1  racnode1-priv racnode1-vip
racnode2  racnode2-priv racnode2-vip
然后指定 eth0 的类型时public,这时eth0的类型默认的是priv,需要改成public
然后制定你的OCR 和mirror
/u02/oradata/orcl/OCRFile
/u02/oradata/orcl/OCRFile_mirror
然后指定你的voting
/u02/oradata/orcl/VotingFile
/u02/oradata/orcl/VotingFile_mirror1
/u02/oradata/orcl/VotingFile_mirror2
然后就开始安装了,当中会让你用完全的root身份在每个节点上运行orainstRoot.sh,你就一个节点一个节点运行
然后要求你在每个节点上用完全的root权限执行 root.sh,你也一样,一个个来
在执行第二个root.sh时报
Running vipca(silent) for configuring nodeapps
/u01/app/oracle/product/10.2.0/crs_1/jdk/jre//bin/java: error while loading shared libraries: libpthread.so.0:
cannot open shared object file: No such file or directory
这个错误主要是vip配置导致,可以采取下面三个步骤进行解决(该bug已在10204得到解决)
1)、在每个节点上,修改$CRS_HOME/bin目录下的srvctl和vipca文件,在vipca文件ARGUMENTS=""行之前和srvctl文件的export LD_ASSUME_KERNEL行之后增加 unset LD_ASSUME_KERNEL 语句
2)、使用$CRS_HOME/bin目录下的oifcfg工具配置pub ip和pri ip
在任意一个节点上使用oifcfg配置public和vip网络
[root@rac1 bin]# ./oifcfg setif -global eth0/192.168.1.0:public
[root@rac1 bin]# ./oifcfg setif -global eth1/10.1.1.0:cluster_interconnect
[root@rac1 bin]# ./oifcfg getif
eth0 192.168.1.0 global public
eth1 10.1.1.0 global cluster_interconnect
./oifcfg iflist
3)、在任意一个节点上,用root用户,手动运行vipca,配置完正确的prvip和vip 信息之后,crs就可以安装完成,操作过程如下
/u01/app/oracle/product/10.2.0/crs_1/bin/vipca
然后把vip增加进去进可以了

然后确定节点是否已经都已增加
./olsnodes -n

$ ls -l /etc/init.d/init.*
-r-xr-xr-x  1 root root  1951 Oct  4 14:21 /etc/init.d/init.crs*
-r-xr-xr-x  1 root root  4714 Oct  4 14:21 /etc/init.d/init.crsd*
-r-xr-xr-x  1 root root 35394 Oct  4 14:21 /etc/init.d/init.cssd*
-r-xr-xr-x  1 root root  3190 Oct  4 14:21 /etc/init.d/init.evmd*

 

下面提供下修改(Public/Private/VIP)的方法
修改10.2 RAC中IP(Public/Private/VIP)的方法
Public/Private对应的的主机名不能更改,如果确实需要更改主机名,需要重新安装CRS。
以下只说明如何更改Public/Private的IP地址。
网卡名可以修改,比如eth0改为eth900,需要响应的修改nodeapps。
VIP可以支持修改名称和IP地址。

1)、 shut down the RDBMS and ASM instances, listeners(如果有asm) and nodeapps on all nodes before shutting down the CRS daemons on
all nodes. Note that these setps must be run in the order specified.

1.1) 查看当前系统上crs运行的状态
$ crs_stat -t

1.2) 关闭数据库
% $ORACLE_HOME/bin/srvctl stop database -d dbname

1.3) To shutdown ASM instances run the following command on each node
% $ORACLE_HOME/bin/srvctl stop asm -n

1.4)To shutdown nodeapps run the following comand on each node:
% $ORACLE_HOME/bin/srvctl stop nodeapps -n

2)、 修改操作系统的ip设置
在主机上修改网卡属性设置。
修改/etc/hosts文件为新的IP地址配置。
重新启用网卡,使设置生效
修改HACMP中的相关设置(建议把HACMP中网卡相关配置全部删除)。

3)、 修改ORACLE中相关设置

3.1) Use the getif option to show the currently configured interfaces. This will display the interfaces that are currently stored in the OCR。
% $ORA_CRS_HOME/bin/oifcfg getif
eth0 192.168.1.0 global public
eth1 10.1.1.0 global cluster_interconnect

3.2) If the public interface IP needs to be changed, you will need to delete the interface and add it back with the correct subnet IP.
% $ORA_CRS_HOME/bin/oifcfg delif -global eth0
% $ORA_CRS_HOME/bin/oifcfg setif -global eth0/192.168.2.0:public

syntax: oifcfg setif /:

3.3) The same step could be use for the private interface:
% $ORA_CRS_HOME/bin/oifcfg delif -global eth1
% $ORA_CRS_HOME/bin/oifcfg setif -global eth1/10.1.2.0:cluster_interconnect

3.4) Verify the correct interface subnet is in use by re-running oifcfg with the ‘getif’ option:
% $ORA_CRS_HOME/bin/oifcfg getif
eth0 192.168.2.0 global public
eth1 10.1.2.0 global cluster_interconnect

4)、 change VIP settings
4.1) confirm current VIP setting
% $ORA_CRS_HOME/bin/srvctl config nodeapps -n racnode1 -a
VIP exists.: /racnode1-vip/192.168.1.150/255.255.255.0/Public
4.2) 确保所有资源已经停止,如果没有重新执行步骤1
执行以下命令确认VIP已经OFFLINE
$ crs_stat -t
4.3) 修改/etc/hosts中VIP的地址
4.4) 修改ORACLE中VIP设定
使用root执行
# srvctl modify nodeapps -n racnode1 -A 192.168.1.125/255.255.255.0/eth0
4.5) 重新执行4.1 确认VIP修改正确
4.6) 修改LISTENER和TNSNAMES相关IP配置
4.7) 启动相关服务
$ srvctl start nodeapps -n racrnode1

RAC中执行crs_stop -all后提示一些服务停不了,再用crs_stat -t查看状态的时候,停不掉的服务会显示状态是UNKNOWN, 服务在UNKNOWN状态下用 crs_start
不能启动服务
此时可有两种方法来解决:
方法一:先禁用crs服务,后启用crs服务(相当于从新启动系统,因为crs是随系统自动启动的),需要在两台节点上都执行;
具体步骤:
[root@racnode1 ~]# /etc/init.d/init.crs stop
[root@racnode1 ~]# /etc/init.d/init.crs start
方法二:可以使用crs_stop -f先强制停止服务,在启动服务(在一台节点上运行即可);
具体步骤:(其他资源同样操作,资源的查看命令为crs_stat)
[oracle@racnode2 ~]$ crs_stop -f ora.racnode1.ons
[oracle@racnode2 ~]$ crs_start -f ora.racnode1.ons  

9、安装oracle10g数据库软件
取消 ORACLE_HOME 的设置
unset ORA_CRS_HOME
unset ORACLE_HOME
unset ORACLE_OWNER
unset ORA_NLS33
unset TNS_ADMIN
unset LIBPATH
unset LD_LIBRARY_PATH
核实 racnode1 上的环境变量
env | grep ORA
ORACLE_SID=rac1
ORACLE_BASE=/u01/app/oracle
ORACLE_TERM=xterm

核实 racnode2 上的环境变量
env | grep ORA
ORACLE_SID=rac2
ORACLE_BASE=/u01/app/oracle
ORACLE_TERM=xterm

gunzip 10201_database_linux_x86_64.cpio.gz
cpio -idmv < 10201_database_linux_x86_64.cpio

用oracle用户,运行database目录下的runInstaller
ORACLE安装目录指定到 /u01/app/oracle/product/10.2.0/db_1,把2个node选择上,选择 Install database Software only,安装快结束时
会要求你用完全的root权限运行 root.sh ,分别在2个node上一一运行,结束安装。

10、配置netca

用oracle 用户在一个node上运行 netca,选择所有node,选择  Listener configuration,添加一个LISTEN, 1521 port
回到开始界面,选择Naming Methods configuration
把Local Naming和Easy Naming 添加进去.然后结束配置
 确认一下
$ ps -ef | grep lsnr | grep -v 'grep' | grep -v 'ocfs' | awk '{print $9}'
LISTENER_NODE1PUB

tnsname.ora 的配置会在安装oracle数据库的时候自动完成,所以不用手工的去配置tnsname.ora文件了

11、安装oracle数据库(在安装前先确保LISTENER和crs都是启动的)
. 用oracle用户运行 dbca,选择custom database,输入数据库的全局名,比如rac
 给你的系统的不同角色建立密码,我都选择same as ....
 

因我用的是ocfs,所以在选数据库路径的时候,选择/u01/app/oracle/oradate/rac,同时字符集选择ZHS16GBK
接下来默认的就可以了, Database Services 这里,你选择Add你一个新的service, 随便叫名字,比如rac
然后选择 TAF Policy,是Basic, 开始创建数据库

12、
1.用oracle用户login, 运行

./srvctl status database -d rac
Instance rac1 is running on node racnode1
Instance rac2 is running on node racnode2

2.
$ srvctl status service -d rac -s rac
Service orcltest is running on instance(s)rac2, rac1


3.
    $ srvctl status nodeapps -n racnode1
    VIP is running on node:  racnode1
    GSD is running on node: racnode1
    Listener is running on node: racnode1
    ONS daemon is running on node: racnode1


4.
$ srvctl config nodeapps -n racnode1 -a -g -s -l
VIP exists.: /racnode1-vip/192.168.1.200/255.255.255.0/eth0:eth1
GSD exists.
ONS daemon exists.
Listener exists.

6. 运行 sqlplus  /nolog

SQL> connect /as sysdba
SQL>

col INST_ID for 99
col INST_NO for 99
col INST_NAME for a10
col parallel for a10
col status for a10
col db_status for a10
col state for a10
col host for a10

    SELECT
        inst_id
      , instance_number inst_no
      , instance_name inst_name
      , parallel
      , status
      , database_status db_status
      , active_state state
      , host_name host
    FROM gv$instance
    ORDER BY inst_id;

INST_ID INST_NO INST_NAME  PARALLEL   STATUS     DB_STATUS  STATE     HOST
------- ------- ---------- ---------- ---------- ---------- --------- ----------
      1       1 rac1       YES        OPEN       ACTIVE     NORMAL    racnode1
      2       2 rac2       YES        OPEN       ACTIVE     NORMAL    racnode2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值