作者 | JiekeXu
来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)
如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA)
大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看 YashanDB 23.1 个人版脚本安装及简单查询测试,欢迎点击上方蓝字“JiekeXu DBA之路”关注我的公众号,标星或置顶,更多干货第一时间到达!
为啥会写这篇文章呢,起初是因为上篇文章测试的是崖山企业版本以及和 Oracle 12c 的性能对比,总体感觉还不错,但这几天看到有几位大佬测试的结果是 Oracle 11.2.0.4 比 YashanDB 性能要强很多,感觉和我之前测试的有出入,所以想在测一测,在体验体验,看看问题在哪是不是我出现了啥错误,而且这次把 Oracle 12c 多租户环境换成非容器 19c 单机版本来试试。
1.下载个人版 YashanDB
我这里下载 x86 架构软件包 YashanDB https://download.yashandb.com/download
2.操作系统基本信息
代码语言:javascript复制[root@jieke-19c ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 2
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 79
Model name: Intel(R) Xeon(R) CPU E7-4809 v4 @ 2.10GHz
Stepping: 1
CPU MHz: 2094.952
BogoMIPS: 4189.90
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 20480K
NUMA node0 CPU(s): 0-7
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap xsaveopt arat spec_ctrl intel_stibp flush_l1d arch_capabilities
[root@Ops-19cOGG ~]# cat /proc/cpuinfo |grep processor |wc -l
8
[root@jieke-19c ~]# free -h
total used free shared buff/cache available
Mem: 15G 1.1G 6.1G 6.3G 8.3G 7.9G
Swap: 7.9G 16M 7.9G
[root@jieke-19c ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rootvg-lvroot 392G 314G 78G 81% /
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 56K 7.8G 1% /dev/shm
tmpfs 7.8G 81M 7.7G 2% /run
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/sda1 1014M 190M 825M 19% /boot
tmpfs 1.6G 0 1.6G 0% /run/user/54321
tmpfs 1.6G 0 1.6G 0% /run/user/0
[root@jieke-19c ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.6 (Maipo)
3.系统参数调整
调整资源限制值
代码语言:javascript复制[root@jieke-19c ~]# echo "
yashan soft nofile 65536
yashan hard nofile 65536
yashan soft nproc 65536
yashan hard nproc 65536
yashan soft rss unlimited
yashan hard rss unlimited
yashan soft stack 8192
yashan hard stack 8192
" >> /etc/security/limits.conf
4.创建用户和组
代码语言:javascript复制[root@jieke-19c ~]# groupadd YASDBA
[root@jieke-19c ~]# useradd yashan -G YASDBA
[root@jieke-19c ~]# echo "yashan"|passwd --stdin yashan
5.上传软件包并解压
代码语言:javascript复制
代码语言:javascript复制[root@jieke-19c ~]# su - yashan
[yashan@jieke-19c ~]$ mkdir soft
[yashan@jieke-19c ~]$ cd soft/
[yashan@jieke-19c soft]$ ll
total 171280
-rw-r--r-- 1 root root 175386922 Nov 20 11:32 yashandb-personal-23.1.1.100-linux-x86_64.tar.gz
[yashan@jieke-19c soft]$ tar -zxvf yashandb-personal-23.1.1.100-linux-x86_64.tar.gz
[yashan@jieke-19c soft]$ ll
total 171312
drwxrwxr-x 6 yashan yashan 70 Nov 9 18:16 admin
drwxrwxr-x 2 yashan yashan 188 Nov 9 18:16 bin
drwxrwxr-x 2 yashan yashan 152 Nov 9 18:16 conf
drwxrwxr-x 5 yashan yashan 60 Nov 9 18:16 ext
-rw-rw-r-- 1 yashan yashan 11632 Nov 9 18:16 gitmoduleversion.dat
drwxrwxr-x 2 yashan yashan 65 Nov 9 18:16 include
drwxrwxr-x 3 yashan yashan 17 Nov 9 18:16 java
drwxrwxr-x 2 yashan yashan 4096 Nov 9 18:16 lib
-rw-r----- 1 yashan yashan 14989 Nov 9 18:16 LICENSE
drwxrwxr-x 3 yashan yashan 21 Nov 9 18:16 plug-in
drwxrwxr-x 2 yashan yashan 170 Nov 9 18:16 scripts
-rw-r--r-- 1 root root 175386922 Nov 20 11:32 yashandb-personal-23.1.1.100-linux-x86_64.tar.gz
代码语言:javascript复制6.使用自带脚本快速安装并初始化库
本次只是简单体验,不进行单独目录规划及参数规划,scripts 目录下的 install.ini 文件则是一个初始化参数文件,可修改相关参数后初始化使用,我们直接使用 install.sh 脚本安装数据库软件,initDB.sh 初始化数据库实例。
代码语言:javascript复制
代码语言:javascript复制[yashan@jieke-19c soft]$ cd scripts/
[yashan@jieke-19c scripts]$ ll
total 32
-rwxrwxr-x 1 yashan yashan 3296 Nov 9 18:16 createResourceCgroup.sh
-rwxrwxr-x 1 yashan yashan 2934 Nov 9 18:16 initDB.sh
-rwxrwxr-x 1 yashan yashan 2104 Nov 9 18:16 initStandby.sh
-rw-rw-r-- 1 yashan yashan 411 Nov 9 18:16 install.ini
-rwxrwxr-x 1 yashan yashan 1412 Nov 9 18:16 install.sh
-rwxrwxr-x 1 yashan yashan 1157 Nov 9 18:16 startup.sh
-rwxrwxr-x 1 yashan yashan 1157 Nov 9 18:16 stop.sh
-rwxrwxr-x 1 yashan yashan 667 Nov 9 18:16 yascheckStart.sh
[yashan@jieke-19c scripts]$ more install.ini
[install]
YASDB_HOME=~/yashandb/yasdb_home
YASDB_DATA=~/yashandb/yasdb_data
REDO_FILE_SIZE=100M
REDO_FILE_NUM=4
INSTALL_SIMPLE_SCHEMA_SALES=N
NLS_CHARACTERSET=UTF8
[instance]
LISTEN_ADDR=0.0.0.0:1688
DB_BLOCK_SIZE=8K
DATA_BUFFER_SIZE=256M
SHARE_POOL_SIZE=256M
WORK_AREA_POOL_SIZE=32M
LARGE_POOL_SIZE=32M
REDO_BUFFER_SIZE=8M
UNDO_RETENTION=300
OPEN_CURSORS=310
MAX_SESSIONS=1024
RUN_LOG_LEVEL=INFO
NODE_ID=1-1:1
[yashan@jieke-19c scripts]$ more install.sh
#!/bin/bash
#install.sh
FILE_PATH=$(dirname "$(readlink -f "$0")")
PACKAGE_PATH=$(dirname "${FILE_PATH}")
YASDB_TEMP_FILE="${FILE_PATH}/.temp.ini"
YASDB_INSTALL_FILE="${FILE_PATH}/install.ini"
# shellcheck disable=SC2002
cat "${YASDB_INSTALL_FILE}" | grep "=" > "${YASDB_TEMP_FILE}"
# shellcheck disable=SC1090
source "${YASDB_TEMP_FILE}"
if [ -d "$YASDB_HOME" ]; then
echo -e "install failed!n$YASDB_HOME already exists."
exit 1
fi
if [ -f "$YASDB_DATA"/config/yasdb.ini ]; then
echo -e "install failed!n$YASDB_DATA used, yasdb.ini is already exists"
exit 1
fi
##创建数据库软件目录
mkdir -p "$YASDB_HOME"
cp -ra "$PACKAGE_PATH"/{admin,bin,conf,gitmoduleversion.dat,include,java,lib,plug-in,scripts} "$YASDB_HOME"
mkdir -p "$YASDB_HOME"/client
touch "$YASDB_HOME"/client/yasc_service.ini
##创建数据库数据目录
mkdir -p "$YASDB_DATA"/{config,data,dbfiles,instance,archive,local_fs,log/{run,audit,trace,alarm,alert,listener},diag/{metadata,hm,blackbox
}}
##配置数据库环境变量
sed -i '/'"source ${YASDB_HOME////\/}/conf/yasdb.bashrc"'/d' ~/.bashrc
YASDB_ENV_FILE="${YASDB_HOME}/conf/yasdb.bashrc"
cat >"${YASDB_ENV_FILE}" <<EOF
export YASDB_HOME=$YASDB_HOME
export YASDB_DATA=$YASDB_DATA
export PATH=$YASDB_HOME/bin:$PATH
export LD_LIBRARY_PATH=$YASDB_HOME/lib:$LD_LIBRARY_PATH
EOF
cat >>~/.bashrc <<EOF
[ -f $YASDB_ENV_FILE ] && source $YASDB_ENV_FILE
EOF
[yashan@jieke-19c ~]$ more /home/yashan/soft/scripts/initDB.sh
#!/bin/bash
#initDB.sh
FILE_PATH=$(dirname "$(readlink -f "$0")")
YASDB_TEMP_FILE="${FILE_PATH}/.temp.ini"
INSTALL_INI_FILE="${FILE_PATH}/install.ini"
YASDB_PASSWORD="yasdb_123"
# shellcheck disable=SC1090
source "${YASDB_TEMP_FILE}"
YASDB_ENV_FILE="${YASDB_HOME}/conf/yasdb.bashrc"
YASDB_HOME_BIN_PATH="${YASDB_HOME}/bin"
YASDB_BIN="${YASDB_HOME_BIN_PATH}/yasdb"
YASQL_BIN="${YASDB_HOME_BIN_PATH}/yasql"
YASPWD_BIN="${YASDB_HOME_BIN_PATH}/yaspwd"
# shellcheck disable=SC1090
source "${YASDB_ENV_FILE}"
if [ ! -d "$YASDB_HOME" ] || [ ! -d "$YASDB_DATA" ]; then
echo -e "Software installation "./install.sh" is not performed."
exit 1
fi
if [ -f "$YASDB_DATA"/config/yasdb.ini ]; then
echo -e "init failed!n$YASDB_DATA used, yasdb.ini is already exists"
echo -e "do not reinit in $YASDB_DATA, if you want start yasdb, run "./startup.sh""
exit 1
fi
e_i=$(sed -n '$=' "$INSTALL_INI_FILE")
s_i=$(sed -n -e '/<instance>/=' "$INSTALL_INI_FILE")
n_i=$((s_i 1))
sed -n "${n_i},${e_i} p" "$INSTALL_INI_FILE" >>"$YASDB_DATA"/config/yasdb.ini
##创建密码文件
if [ ! -f "$YASDB_HOME/admin/yasdb.pwd" ]; then
"$YASPWD_BIN" file="$YASDB_HOME"/admin/yasdb.pwd password="$YASDB_PASSWORD"
else
rm -f "$YASDB_HOME"/admin/yasdb.pwd
"$YASPWD_BIN" file="$YASDB_HOME"/admin/yasdb.pwd password="$YASDB_PASSWORD"
fi
cp "$YASDB_HOME"/admin/yasdb.pwd "$YASDB_DATA"/instance/yasdb.pwd
REDOFILE="("
for ((i = 0; i < "$REDO_FILE_NUM"; i )); do
if [ $i == $((REDO_FILE_NUM - 1)) ]; then
REDOFILE=${REDOFILE}"'redo${i}'"" size $REDO_FILE_SIZE)"
else
REDOFILE=${REDOFILE}"'redo${i}'"" size $REDO_FILE_SIZE,"
fi
done
##创建数据库
START_LOG_FILE="$YASDB_DATA/log/start.log"
rm -rf "${START_LOG_FILE}"
"${YASDB_BIN}" nomount -D "$YASDB_DATA" >"$START_LOG_FILE" 2>&1 &
i=0
while ((i < 5))
do
sleep 2
# shellcheck disable=SC2002 disable=SC2126
alive=$(cat "$START_LOG_FILE" | grep "Instance started" | wc -l)
if [ "$alive" -ne 0 ]; then
echo "process started!"
break
fi
i=$((i 1))
done
if [ "$i" -eq "5" ];then
echo "start process failed. read $START_LOG_FILE"
cat "$START_LOG_FILE"
exit 1
fi
"${YASQL_BIN}" sys/$YASDB_PASSWORD >>"$START_LOG_FILE" <<EOF
create database yasdb CHARACTER SET $NLS_CHARACTERSET logfile $REDOFILE;
exit;
EOF
i=0
while ((i < 60))
do
sleep 1
alive=$($YASQL_BIN sys/$YASDB_PASSWORD -c "select open_mode from v$database" | grep -c READ_WRITE)
if [ "$alive" -eq 1 ]; then
echo "Database open succeed !"
break
fi
i=$((i 1))
done
if [ "$i" -eq "60" ];then
echo "Failed ! please check logfile $START_LOG_FILE ."
exit 1
fi
##创建样例数据:sales
if [ "$INSTALL_SIMPLE_SCHEMA_SALES" == 'Y' ] || [ "$INSTALL_SIMPLE_SCHEMA_SALES" == 'y' ]; then
"${YASQL_BIN}" sys/$YASDB_PASSWORD -f "$YASDB_HOME"/admin/simple_schema/sales.sql >>"$START_LOG_FILE"
fi
exit 0
####密码以二进制形式存储,不可读。根据上面 initDB.sh 文件中的 YASDB_PASSWORD 可知密码为 yasdb_123
[yashan@jieke-19c ~]$ strings $YASDB_HOME/admin/yasdb.pwd
S:5C8774C730A775DF857AC562BBA45B20B07C7BB8123D75F03C9FA007645B69CF5168AD585B10A5F795E0
执行 install.sh 没有输出记录,但是在当前用户家目录下生成了 yashandb 子目录,此目录下包含 yasdb_home 和 yasdb_data 目录。
代码语言:javascript复制[yashan@jieke-19c scripts]$ sh install.sh
[yashan@jieke-19c scripts]$ cd
[yashan@jieke-19c ~]$ ll
total 0
drwxrwxr-x 11 yashan yashan 220 Nov 22 16:27 soft
drwxrwxr-x 4 yashan yashan 42 Nov 22 17:42 yashandb
[yashan@jieke-19c ~]$ cd yashandb/
[yashan@jieke-19c yashandb]$ ll
total 0
drwxrwxr-x 10 yashan yashan 117 Nov 22 17:42 yasdb_data
drwxrwxr-x 11 yashan yashan 152 Nov 22 17:42 yasdb_home
[yashan@jieke-19c yashandb]$ du -sh *
0 yasdb_data
432M yasdb_home
[yashan@jieke-19c yashandb]$ pwd
/home/yashan/yashandb
--初始化数据库实例,类似于 Oracle 的 dbca
[yashan@jieke-19c scripts]$ cd /home/yashan/soft/scripts
[yashan@jieke-19c scripts]$ ./initDB.sh
process started!
Database open succeed !
--初始化之后会生成 yasdb_data 的文件,看着目录结构和 O 记很像很像。
[yashan@jieke-19c yashandb]$ ll
total 0
drwxrwxr-x 11 yashan yashan 128 Nov 27 11:01 yasdb_data
drwxrwxr-x 11 yashan yashan 152 Nov 22 17:42 yasdb_home
[yashan@jieke-19c yashandb]$ tree -L 3 yasdb_data
yasdb_data
-- archive
-- config
¦ -- yasdb.ini
-- data
-- dbfiles
¦ -- ctrl1
¦ -- ctrl2
¦ -- ctrl3
¦ -- dwf
¦ -- redo0
¦ -- redo1
¦ -- redo2
¦ -- redo3
¦ -- swap
¦ -- sysaux
¦ -- system
¦ -- temp
¦ -- undo
¦ -- users
-- diag
¦ -- adr.pid
¦ -- blackbox
¦ -- hm
¦ -- metadata
¦ ¦ -- hm_finding
¦ ¦ -- hm_run
¦ ¦ -- incident
¦ ¦ -- problem
¦ -- trace
-- instance
¦ -- yasdb.ipc
¦ -- yasdb.pid
¦ -- yasdb.pwd
-- local_fs
¦ -- users
-- log
¦ -- alarm
¦ -- alert
¦ ¦ -- alert.log
¦ -- audit
¦ -- listener
¦ ¦ -- listener.log
¦ -- run
¦ ¦ -- run.log
¦ -- slow
¦ ¦ -- slow.log
¦ -- start.log
¦ -- trace
-- tmp
21 directories, 28 files
--生效环境变量
[yashan@jieke-19c scripts]$ cd
[yashan@jieke-19c ~]$ . ~/.bashrc
7.登录数据库
通过上述方式脚本安装的数据库,据上面脚本介绍 sys 默认密码是 yasdb_123。
代码语言:javascript复制[yashan@jieke-19c ~]$ yasql / as sysdba
YashanDB SQL Personal Edition Release 23.1.1.100 x86_64
Connected to:
YashanDB Server Personal Edition Release 23.1.1.100 x86_64 - X86 64bit Linux
SQL> select status,version from v$instance;
STATUS VERSION
------------- ----------------------------------------------------------------
OPEN Personal Edition Release 23.1.1.100 x86_64
1 row fetched.
SQL> exit
[yashan@jieke-19c ~]$ yasql sys/yasdb_123 --居然不用 sysdba 方式登录
YashanDB SQL Personal Edition Release 23.1.1.100 x86_64
Connected to:
YashanDB Server Personal Edition Release 23.1.1.100 x86_64 - X86 64bit Linux
SQL> exit
[yashan@jieke-19c ~]$ yasql sys/yasdb_12 --错误密码无法登录
YashanDB SQL Personal Edition Release 23.1.1.100 x86_64
YAS-02143 invalid username/password, login denied
please input user name:
-- 关闭数据库/重启数据库
SQL> shutdown immediate;
Succeed.
SQL> exit
[yashan@jieke-19c ~]$ nohup yasdb open &
[1] 980
[yashan@jieke-19c ~]$ ps -ef | grep yasdb
yashan 980 31966 21 11:00 pts/0 00:00:10 yasdb open
yashan 1171 31966 0 11:01 pts/0 00:00:00 grep --color=auto yasdb
[yashan@jieke-19c ~]$ yasql / as sysdba
YashanDB SQL Personal Edition Release 23.1.1.100 x86_64
Connected to:
YashanDB Server Personal Edition Release 23.1.1.100 x86_64 - X86 64bit Linux
SQL> select status from v$instance;
STATUS
-------------
OPEN
1 row fetched.
SQL> SELECT NAME,STATUS,EXTENT_BLOCKS,ALLOCATION_TYPE,MEMORY_MAPPED,ENCRYPTED,COMPRESSED FROM V$TABLESPACE;
NAME STATUS EXTENT_BLOCKS ALLOCATION_TYPE MEMORY_MAPPED ENCRYPTED COMPRESSED
---------------------------------------------------------------- ----------------- ------------- --------------- ------------- --------- ----------
SYSTEM ONLINE 8 AUTO FALSE FALSE FALSE
SYSAUX ONLINE 8 AUTO FALSE FALSE FALSE
TEMP ONLINE 8 UNIFORM FALSE FALSE FALSE
SWAP ONLINE 8 UNIFORM FALSE FALSE FALSE
USERS ONLINE 8 AUTO FALSE FALSE FALSE
UNDO ONLINE 1 UNIFORM FALSE FALSE FALSE
6 rows fetched.
8.查看崖山数据库线程
代码语言:javascript复制
代码语言:javascript复制[yashan@jieke-19c bin]$ pwd
/home/yashan/yashandb/yasdb_home/bin
[yashan@jieke-19c bin]$ ls -l /home/yashan/yashandb/yasdb_home/bin
total 59076
-rwxr-xr-x 1 yashan yashan 101320 Nov 9 18:16 exp
-rwxr-xr-x 1 yashan yashan 79944 Nov 9 18:16 imp
-rwxrwxr-x 1 yashan yashan 19865208 Nov 9 18:16 yasagent
-rwxrwxr-x 1 yashan yashan 5986112 Nov 9 18:16 yasbak
-rwxrwxr-x 1 yashan yashan 9381440 Nov 9 18:16 yasboot
-rwxr-xr-x 1 yashan yashan 181096 Nov 9 18:16 yasdb
-rwxr-xr-x 1 yashan yashan 779640 Nov 9 18:16 yasldr
-rwxrwxr-x 1 yashan yashan 21896816 Nov 9 18:16 yasom
-rwxr-xr-x 1 yashan yashan 66072 Nov 9 18:16 yaspwd
-rwxr-xr-x 1 yashan yashan 645680 Nov 9 18:16 yasql
-rwxr-xr-x 1 yashan yashan 773256 Nov 9 18:16 yasrman
-rwxr-xr-x 1 yashan yashan 120136 Nov 9 18:16 yaswrap
-rwxr-xr-x 1 yashan yashan 590416 Nov 9 18:16 yex_server
--查看数据库进程 980 对应的线程 top -Hp 980
[yashan@jieke-19c bin]$ ps -ef | grep yasdb
yashan 980 1 14 11:00 pts/0 00:04:39 yasdb open
yashan 4716 2449 0 11:33 pts/0 00:00:00 grep --color=auto yasdb
[yashan@jieke-19c bin]$ ps -Tp 980
PID SPID TTY TIME CMD
980 980 pts/0 00:00:03 yasdb
980 981 pts/0 00:00:33 TIMER
980 982 pts/0 00:00:04 BUFFER_POOL
980 983 pts/0 00:00:00 PRELOADER
980 984 pts/0 00:00:00 PRELOADER
980 985 pts/0 00:00:00 SMON
980 986 pts/0 00:00:05 CKPT
980 988 pts/0 00:00:00 DBWR
980 989 pts/0 00:00:00 DBWR
980 990 pts/0 00:00:00 SCHD_TIMER
980 991 pts/0 00:00:04 LISTENER_LOG
980 992 pts/0 00:00:00 TCP_LSNR
980 993 pts/0 00:00:00 TCP_LSNR
980 1013 pts/0 00:00:00 HEALTH_MONITOR
980 1033 pts/0 00:00:00 HOT_CACHE_RECYC
980 1034 pts/0 00:00:00 LOGW
980 1041 pts/0 00:00:07 XFMR
980 1042 pts/0 00:01:31 XFMR_WORKER_0
980 1043 pts/0 00:00:03 MMON
980 1044 pts/0 00:00:00 JOB_QUEUE
980 1045 pts/0 00:00:00 XFMR_WORKER_1
980 1046 pts/0 00:00:00 XFMR_WORKER_2
980 1047 pts/0 00:00:00 XFMR_WORKER_3
980 1048 pts/0 00:00:00 XFMR_WORKER_4
980 1049 pts/0 00:00:00 XFMR_WORKER_5
980 1050 pts/0 00:00:00 XFMR_WORKER_6
980 1051 pts/0 00:00:00 XFMR_WORKER_7
980 1052 pts/0 00:00:00 XFMR_WORKER_8
980 1053 pts/0 00:00:00 XFMR_WORKER_9
980 1054 pts/0 00:00:00 XFMR_WORKER_10
980 1055 pts/0 00:00:00 XFMR_WORKER_11
980 1056 pts/0 00:00:00 XFMR_WORKER_12
980 1057 pts/0 00:00:00 XFMR_WORKER_13
980 1058 pts/0 00:00:00 XFMR_WORKER_14
980 1059 pts/0 00:00:00 XFMR_WORKER_15
980 1060 pts/0 00:00:00 XFMR_WORKER_16
980 1061 pts/0 00:00:00 XFMR_WORKER_17
980 1062 pts/0 00:00:00 XFMR_WORKER_18
980 1063 pts/0 00:00:00 XFMR_WORKER_19
980 1066 pts/0 00:00:00 XFMR_WORKER_20
980 1067 pts/0 00:00:00 XFMR_WORKER_21
980 1068 pts/0 00:00:00 XFMR_WORKER_22
980 1069 pts/0 00:00:00 XFMR_WORKER_23
980 1070 pts/0 00:00:00 XFMR_WORKER_24
980 1071 pts/0 00:00:00 XFMR_WORKER_25
980 1072 pts/0 00:00:00 XFMR_WORKER_26
980 1073 pts/0 00:00:00 XFMR_WORKER_27
980 1074 pts/0 00:00:00 XFMR_WORKER_28
980 1075 pts/0 00:00:00 XFMR_WORKER_29
980 1076 pts/0 00:00:00 XFMR_WORKER_30
980 1077 pts/0 00:00:00 XFMR_WORKER_31
-- v$process 视图也可以看到上述线程。
SQL> select * from v$process;
可以看到 YashanDB 是单进程多线程架构,Oracle 中的很多进程,SMON、MMON、CKPT、DBWR 等进程在崖山数据库中都以线程的形式存在。
9.修改参数及数据插入对比
代码语言:javascript复制--Oracle 19.12 单机文件系统,配置为 8c16g 的同一台虚拟机,且均开启了归档日志
SQL*Plus: Release 19.0.0.0.0 - Production on Tue Nov 28 11:10:48 2023
Version 19.12.0.0.0
Copyright (c) 1982, 2021, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.12.0.0.0
SYS@test> show parameter sga_
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 6560M
sga_min_size big integer 0
sga_target big integer 6560M
unified_audit_sga_queue_size integer 1048576
SYS@test> !free -h
total used free shared buff/cache available
Mem: 15G 1.7G 5.4G 6.2G 8.4G 7.4G
Swap: 7.9G 16M 7.9G
--同样我们需要设置 YashanDB 的参数为上面 SGA 的大小,并重启数据库
--查看参数
show parameter DATA_BUFFER_SIZE --256M
show parameter VM_BUFFER_SIZE --32M
--修改参数并重启数据库
alter system set DATA_BUFFER_SIZE=6560M scope=spfile;
alter system set VM_BUFFER_SIZE=6560M scope=spfile;
shutdown immediate;
exit
nohup yasdb open &
Oracle 19c 导出操作
代码语言:javascript复制grant connect,resource,dba to test;
conn test/test
create table T_base_table as select * from dba_objects;
select count(*) from T_base_table;
COUNT(*)
----------
131341
Elapsed: 00:00:00.54
--获取此基表 DDL 建表语句,并将其简单修改下
TEST@test> set long 9999
TEST@test> SELECT DBMS_METADATA.GET_DDL('TABLE','T_BASE_TABLE','TEST') DDL_SQL FROM DUAL;
CREATE TABLE "TEST"."T_BASE_TABLE"
( "OWNER" VARCHAR2(128) ,
"OBJECT_NAME" VARCHAR2(128) ,
"SUBOBJECT_NAME" VARCHAR2(128) ,
"OBJECT_ID" NUMBER,
"DATA_OBJECT_ID" NUMBER,
"OBJECT_TYPE" VARCHAR2(23) ,
"CREATED" DATE,
"LAST_DDL_TIME" DATE,
"TIMESTAMP" VARCHAR2(19) ,
"STATUS" VARCHAR2(7) ,
"TEMPORARY" VARCHAR2(1) ,
"GENERATED" VARCHAR2(1) ,
"SECONDARY" VARCHAR2(1) ,
"NAMESPACE" NUMBER,
"EDITION_NAME" VARCHAR2(128) ,
"SHARING" VARCHAR2(18) ,
"EDITIONABLE" VARCHAR2(1) ,
"ORACLE_MAINTAINED" VARCHAR2(1) ,
"APPLICATION" VARCHAR2(1) ,
"DEFAULT_COLLATION" VARCHAR2(100) ,
"DUPLICATED" VARCHAR2(1) ,
"SHARDED" VARCHAR2(1) ,
"CREATED_APPID" NUMBER,
"CREATED_VSNID" NUMBER,
"MODIFIED_APPID" NUMBER,
"MODIFIED_VSNID" NUMBER
) TABLESPACE "TEST";
--使用 sqluldr2 导出 CSV 文件,将其导入到崖山数据库
--当使用 table 参数时,在目录下会生成对应的 ctl 控制文件,如下语句会生成 t_base_table_sqlldr.ctl 文件。
./sqluldr2_linux64_10204.bin test/test query="select * from t_base_table" table=t_base_table file=/home/oracle/tmp/sqluldr2/t_base_table.csv
0 rows exported at 2023-11-28 15:38:18, size 0 MB.
131341 rows exported at 2023-11-28 15:38:19, size 19 MB.
output file /home/oracle/tmp/sqluldr2/t_base_table.csv closed at 131341 rows, size 19 MB.
cp t_base_table* /tmp/
YashanDB 导入数据
代码语言:javascript复制
代码语言:javascript复制Connected to:
YashanDB Server Personal Edition Release 23.1.1.100 x86_64 - X86 64bit Linux
SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES;
TABLESPACE_NAME
----------------------------------------------------------------
SYSTEM
SYSAUX
TEMP
SWAP
USERS
UNDO
6 rows fetched.
--YashanDB 没有类似 oracle 的 col name for a30 这样的格式化语句,显示看的很难受。
SQL> select file_id,file_name from dba_data_files;
FILE_ID FILE_NAME
------------ ----------------------------------------------------------------
0 /home/yashan/yashandb/yasdb_data/dbfiles/system
1 /home/yashan/yashandb/yasdb_data/dbfiles/sysaux
2 /home/yashan/yashandb/yasdb_data/dbfiles/temp
3 /home/yashan/yashandb/yasdb_data/dbfiles/swap
4 /home/yashan/yashandb/yasdb_data/dbfiles/users
5 /home/yashan/yashandb/yasdb_data/dbfiles/undo
6 rows fetched.
--创建表空间和用户
SQL> CREATE TABLESPACE test datafile '/home/yashan/yashandb/yasdb_data/dbfiles/test' size 1g;
Succeed.
SQL> CREATE USER test IDENTIFIED BY test;
SQL> grant dba to test;
SQL> grant connect to test;
SQL> grant resource to test;
SQL> alter user test default tablespace test;
SQL> select username,account_status,default_tablespace from dba_users;
yasldr 是 YashanDB 提供的数据快速导入工具,用于将 CSV 格式的数据文件快速导入至崖山数据库中,支持通过数据库连接向远端节点进行数据导入。
代码语言:javascript复制-- yasldr 查看帮助信息
[yashan@jieke-19c ~]$ yasldr -H
YashanDB Loader Personal Edition Release 23.1.1.100 x86_64 0e623bd
YashanDB LOADER HELP:
To specify parameters, should use keywords:
Command Format:
YASLDR USERNAME/PASSWORD@IP:PORT KEYWORD=value
"USERNAME/PASSWORD@URL" must be the first on the command line, "@URL" default 127.0.0.1:1688
KEYWORD DESCRIPTION (DEFAULT)
---------------------------------------------------------------------------------------------------
BATCH_SIZE the number of lines per batch, default 4032, range [1, 65535]
CONTROL_FILE a file containing the LOAD statement
CONTROL_TEXT the LOAD statement, only be used when CONTROL_FILE is not specified
MODE import mode, including BASIC/BATCH, default BATCH
PACKET_SIZE client expected packet size, default 128KB, range [65536, 524288]
CONN_POOL_SIZE client connection pool size, default 5, range [1, 32]
Example:
YASLDR USERNAME/PASSWORD@IP:PORT CONTROL_FILE=LOAD.CTL
--使用 yasldr -V 命令可查看版本信息。
[yashan@jieke-19c ~]$ yasldr -V
YashanDB Loader Personal Edition Release 23.1.1.100 x86_64 0e623bd
--命令格式
$ YASLDR USERNAME/PASSWORD@IP:PORT {LOAD Options} {LOAD Statement}
--官方手册参考链接:https://doc.yashandb.com/yashandb/23.1/zh/工具手册/yasldr/yasldr使用指导.html
--参考导出的 ctl 文件和官方文档给出的示例编写 ctl 控制文件
vim t_base_table.ctl
LOAD DATA INFILE '/tmp/t_base_table.csv' FIELDS TERMINATED BY ',' optionally enclosed by '"'
INTO TABLE t_base_table
("OWNER",
"OBJECT_NAME",
"SUBOBJECT_NAME",
"OBJECT_ID",
"DATA_OBJECT_ID",
"OBJECT_TYPE",
"CREATED",
"LAST_DDL_TIME",
"TIMESTAMP",
"STATUS",
"TEMPORARY",
"GENERATED",
"SECONDARY",
"NAMESPACE",
"EDITION_NAME",
"SHARING",
"EDITIONABLE",
"ORACLE_MAINTAINED",
"APPLICATION",
"DEFAULT_COLLATION",
"DUPLICATED",
"SHARDED",
"CREATED_APPID",
"CREATED_VSNID",
"MODIFIED_APPID",
"MODIFIED_VSNID"
)
--导入数据
[yashan@jieke-19c tmp]$ yasldr test/test@127.0.0.1:1688 batch_size=4032 mode=batch packet_size=131072 control_file=/tmp/t_base_table.ctl
YashanDB Loader Personal Edition Release 23.1.1.100 x86_64 0e623bd
131341 rows successfully loaded.
Check /tmp/t_base_table.log for more info.
[YASLDR] execute succeeded
#查询数据库表中的数据条数是否和 Oracle 中条数一致
[yashan@jieke-19c tmp]$ yasql test/test@127.0.0.1:1688 -c "select count(*) from t_base_table"
COUNT(*)
---------------------
131341
1 row fetched.
[yashan@jieke-19c tmp]$ yasql / as sysdba
SQL> select sysdate from dual;
SYSDATE
--------------------------------
2023-11-28
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYY
----------------------------------------------------------------
2023-11-28 17:34:47
SQL> select rowid,object_id from test.t_base_table where rownum<=3;
ROWID OBJECT_ID
-------------------------------------------- -----------
2272:6:0:132:0 16
2272:6:0:132:1 20
2272:6:0:132:2 8
3 rows fetched.
SQL> select object_id,data_object_id from dba_objects where object_name='T_BASE_TABLE';
OBJECT_ID DATA_OBJECT_ID
--------------------- ---------------------
2272 2272
SQL> select file_id from dba_data_files where tablespace_name='TEST';
FILE_ID
------------
6
不难看出崖山数据库的 ROWID 结构为五组数字用冒号分割来表示:daba_object_id:tablespace_file_id:file_id:block_number:row#。
简单查询对比
接下来我们进行一个简单的插入和表关联对比,为了避免影响,同一时刻只有一个数据库是启动状态的,现在我们在 Oracle 中进行插入数据,关闭崖山数据库。
Oracle 19c
代码语言:javascript复制#### oracle 19c
alter database datafile 7 resize 10g;
conn test/test
create table T_BIG_TABLE as select * from T_BASE_TABLE;
begin
for i in 1..8 loop
insert into T_BIG_TABLE select * from T_BIG_TABLE;
end loop;
commit;
end;
/
Elapsed: 00:03:21.09
select count(*) from T_BIG_TABLE;
COUNT(*)
----------
33623296
Elapsed: 00:01:12.27
create table T_SMALL_TABLE as select * from T_BASE_TABLE;
begin
for i in 1..4 loop
insert into T_SMALL_TABLE select * from T_SMALL_TABLE;
end loop;
commit;
end;
/
Elapsed: 00:00:04.50
select count(*) from T_SMALL_TABLE;
COUNT(*)
----------
2101456
Elapsed: 00:00:00.24
select /* USE_HASH(A B) */ count(*) from T_BIG_TABLE A,T_SMALL_TABLE B WHERE A.object_id=B.object_id;
COUNT(*)
----------
537956352
Elapsed: 00:01:16.32
create index idx_t_big_table_id on t_big_table(object_id);
Index created.
Elapsed: 00:02:33.97
create index idx_t_small_table_id on t_small_table(object_id);
Index created.
Elapsed: 00:00:07.62
select /* USE_NL(A B) */ count(*) from T_BIG_TABLE A,T_SMALL_TABLE B WHERE A.object_id=B.object_id;
COUNT(*)
----------
537956352
Elapsed: 00:02:55.90
22:16:26 TEST@test> set autot traceonly
22:16:32 TEST@test> select /* USE_NL(A B) */ count(*) from T_BIG_TABLE A,T_SMALL_TABLE B WHERE A.object_id=B.object_id;
Elapsed: 00:02:41.73
Execution Plan
----------------------------------------------------------
Plan hash value: 188159531
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 10 | 263K (1)| 00:00:11 |
| 1 | SORT AGGREGATE | | 1 | 10 | | |
| 2 | NESTED LOOPS | | 131K| 1282K| 263K (1)| 00:00:11 |
| 3 | TABLE ACCESS FULL| T_BIG_TABLE | 131K| 641K| 344 (2)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | IDX_T_SMALL_TABLE_ID | 1 | 5 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 1 (U - Unused (1))
---------------------------------------------------------------------------
3 - SEL$1 / A@SEL$1
U - USE_NL(A B)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
38649498 consistent gets
444251 physical reads
0 redo size
554 bytes sent via SQL*Net to client
438 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
现在关闭 Oracle 数据库,启动 YashanDB 执行上述操作,我们先扩一下 test 表空间,然后使用相同 SQL 插入相同数据量的数据进行简单查询。
YashanDB 个人版
代码语言:javascript复制#### YashanDB 个人版
YashanDB SQL Personal Edition Release 23.1.1.100 x86_64
Connected to:
YashanDB Server Personal Edition Release 23.1.1.100 x86_64 - X86 64bit Linux
SQL>
SQL> alter database datafile '/home/yashan/yashandb/yasdb_data/dbfiles/test' resize 10g;
conn test/test
create table T_BIG_TABLE as select * from T_BASE_TABLE;
begin
for i in 1..8 loop
insert into T_BIG_TABLE select * from T_BIG_TABLE;
end loop;
commit;
end;
/
Elapsed: 00:02:51.247
select count(*) from T_BIG_TABLE;
COUNT(*)
----------
33623296
Elapsed: 00:00:03.837
select object_id,data_object_id from dba_objects where object_name='T_SMALL_TABLE';
OBJECT_ID DATA_OBJECT_ID
--------------------- ---------------------
2274 2288
create table T_SMALL_TABLE as select * from T_BASE_TABLE;
begin
for i in 1..4 loop
insert into T_SMALL_TABLE select * from T_SMALL_TABLE;
end loop;
commit;
end;
/
Elapsed: 00:00:07.631
select count(*) from T_SMALL_TABLE;
COUNT(*)
----------
2101456
Elapsed: 00:00:00.260
select /* USE_HASH(A B) */ count(*) from T_BIG_TABLE A,T_SMALL_TABLE B WHERE A.object_id=B.object_id;
COUNT(*)
----------
537956352
Elapsed: 00:03:23.322
--创建索引
SQL> create index idx_t_big_table_id on t_big_table(object_id);
Elapsed: 00:01:44.781
SQL> create index idx_t_small_table_id on t_small_table(object_id);
Elapsed: 00:00:04.731
SQL> select /* USE_NL(A B) */ count(*) from T_BIG_TABLE A,T_SMALL_TABLE B WHERE A.object_id=B.object_id;
COUNT(*)
---------------------
537956352
Elapsed: 00:03:39.800
SQL> explain select /* USE_NL(A B) */ count(*) from T_BIG_TABLE A,T_SMALL_TABLE B WHERE A.object_id=B.object_id;
PLAN_DESCRIPTION
----------------------------------------------------------------
SQL hash value: 1167597945
Optimizer: ADOPT_C
---- -------------------------------- ---------------------- ------------ ---------- ------------- --------------------------------
| Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info |
---- -------------------------------- ---------------------- ------------ ---------- ------------- --------------------------------
| 0 | SELECT STATEMENT | | | | | |
| 1 | AGGREGATE | | | 1| 152( 0)| |
| 2 | NESTED LOOPS INNER | | | 100000| 150( 0)| |
| 3 | INDEX FAST FULL SCAN | IDX_T_BIG_TABLE_ID | TEST | 100000| 91( 0)| |
|* 4 | INDEX RANGE SCAN | IDX_T_SMALL_TABLE_ID | TEST | 1| 6( 0)| |
---- -------------------------------- ---------------------- ------------ ---------- ------------- --------------------------------
Operation Information (identified by operation id):
---------------------------------------------------
4 - Predicate : access("B"."OBJECT_ID" = "A"."OBJECT_ID")
17 rows fetched.
Elapsed: 00:00:00.001
汇总对比结果
统计对比(单位为秒) | Oracle 19.12 | YashanDB23.1.1.100 | 备注 |
---|---|---|---|
插入3362W T_BIG_TABLE | 201.09s | 171.247s | Y |
Count(*) T_BIG_TABLE | 72.27s | 3.837s | Y |
插入 210W T_SMALL_TABLE | 4.50s | 7.631s | N |
Count(*) T_SMALL_TABLE | 0.24s | 0.260s | N |
两表关联 Hash join 查询 | 76.32s | 203.322s | N |
创建索引 T_BIG_TABLE | 153.97s | 104.781s | Y |
创建索引 T_SMALL_TABLE | 7.62s | 4.731s | Y |
两表关联 NESTED LOOPS 查询 | 175.55s | 219.800s | N |
这个结果和上次使用企业版体验的结果有所差别,小表的插入和查询还是 Oracle 19c 更快一些,当然可能的原因是上次使用的是配置比较低的个人虚拟机安装的 Oracle 12c 版本,本次使用的是公司的虚拟机环境,个人感觉是比较公平公正的测试了,如果有其他意见或建议欢迎交流。总体来看,YashanDB 在大表插入及查询以及创建索引的过程要比 Oracle 19c 更快一些,但是在 Hash join 和 Nest LOOP 关联查询中,性能偏低一些。
全文完,希望可以帮到正在阅读的你,如果觉得此文对你有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~
欢迎关注我公众号【JiekeXu DBA之路】,第一时间一起学习新知识!以下三个地址可以找到我,其他地址均属于盗版侵权爬取我的文章,而且代码格式、图片等均有错乱,不方便阅读,欢迎来我公众号或者墨天轮地址关注我,第一时间收获最新消息。
—————————————————————————— 公众号:JiekeXu DBA之路 CSDN :https://blog.csdn.net/JiekeXu 墨天轮:https://www.modb.pro/u/4347 腾讯云:https://cloud.tencent.com/developer/user/5645107 ——————————————————————————
分享几个数据库备份脚本
Oracle 表碎片检查及整理方案
代码语言:javascript复制OGG|Oracle GoldenGate 基础2022 年公众号历史文章合集整理
代码语言:javascript复制Linux 环境搭建 MySQL8.0.28 主从同步环境