百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

YashanDB 数据库安装部署

liebian365 2024-11-22 17:11 28 浏览 0 评论

最近在学习国产数据库,学习一门数据库第一步应该就是安装部署,有了环境才能动手学习测试。

本文记录了 YashanDB 23.3 的单机安装部署过程,大部分参照官方文档,其中有自己的部分解读。

单机部署最小规模配置为 1 台服务器,但无法构建高可用环境。

部署形态:单机部署

数据库监听:1688

yasom:1675

yasagent:1676

服务器间通信:1689

为保障 YashanDB 的正常安装和运行,请按如下最低版本要求,在所有服务器环境中配置所需依赖项:

在本次安装学习过程中不涉及到数据的压缩和解压缩顾其它依赖项暂不进行升级,本次只升级OpenSSL和monit。

YashanDB 在 23.2 版本增加了一个 openssl 的限制,要求版本必须大于 1.1.1l,否则安装过程可能出错:

[root@node ~]# openssl version
OpenSSL 1.1.1l  24 Aug 2021

如上查看的版本为1.1.1l,为升级后的版本。如果使用7.9安装的话需要升级OpenSSL,如下为升级OpenSSL的步骤:

备份自带 openssl:

[root@node ~]# find /usr -name openssl
/usr/bin/openssl
/usr/include/openssl
[root@node ~]# 
[root@node ~]#  mv /usr/bin/openssl /usr/bin/openssl_old
[root@node ~]# mv /usr/include/openssl /usr/include/openssl_old
[root@node ~]# 

解压安装包安装:

[root@node ~]# tar -zxvf openssl-1.1.1l.tar.gz 
openssl-1.1.1l/
openssl-1.1.1l/ACKNOWLEDGEMENTS
openssl-1.1.1l/AUTHORS
openssl-1.1.1l/CHANGES
...........
[root@node openssl-1.1.1l]# ./config shared zlib --prefix=/usr/local/openssl
[root@node openssl-1.1.1l]#  make && make install

建立软链接 openssl:

[root@node openssl-1.1.1l]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
[root@node openssl-1.1.1l]# ln -s /usr/local/openssl/include/openssl/ /usr/include/openssl
[root@node openssl-1.1.1l]#  echo "/usr/local/openssl/lib/" >> /etc/ld.so.conf
[root@node openssl-1.1.1l]# ldconfig -v

查看 openssl 版本:

[root@node openssl-1.1.1l]# openssl version
OpenSSL 1.1.1l  24 Aug 2021
[root@node openssl-1.1.1l]# 

如果OpenSSL高于1.1.1l这个就不需要升级。

还需要注意的一个就是 Monit 命令,这个工具包也需要安装,否则在使用 yasboot 命令启动 yasagent/yasom 时会报错。

安装monit,如下:

[root@node ~]# ls -ltr
total 225680
-rw-------.  1 root root      1500 Nov  8  2023 anaconda-ks.cfg
-rw-r--r--   1 root root     24512 Mar 13  2024 uuid-devel-1.6.2-26.el7.x86_64.rpm
drwxr-xr-x   4 root root        67 Mar 15  2024 fant
drwxr-xr-x   3 root root        17 Mar 15  2024 go
-rw-r--r--   1 root root   9834044 Nov 20 11:29 openssl-1.1.1l.tar.gz
-rw-r--r--   1 root root 218856122 Nov 20 11:35 yashandb-personal-23.3.1.100-linux-x86_64.tar.gz
-rw-r--r--   1 root root   2293992 Nov 20 11:38 monit-5.34.0-linux-x64.tar.gz
drwxrwxr-x  18 root root      4096 Nov 20 14:46 openssl-1.1.1l
-rw-r--r--   1 root root     70092 Nov 20 15:24 lz4-1.9.3-52.1.x86_64.rpm
[root@node ~]# tar -zxvf monit-5.34.0-linux-x64.tar.gz -C /opt/
  [root@node monit-5.34.0]# ln -s /opt/monit-5.34.0/bin/monit /usr/bin/monit
root@node ~]# monit -V
This is Monit version 5.34.0
Built with ssl, with ipv6, with compression, with pam and with large files
Copyright (C) 2001-2024 Tildeslash Ltd. All Rights Reserved.
[root@node ~]# 

关闭防火墙和Selinux

[root@node ~]# systemctl stop firewalld.service
[root@node ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@node ~]# 
[root@node ~]# 
[root@node ~]# cat /etc/selinux/config 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 


[root@node ~]#

创建安装用户和组:

建议在所有服务器上创建 YashanDB 产品的安装用户,而非使用 root 身份执行安装部署:

[root@node ~]# groupadd YASDBA
[root@node ~]# useradd -d /home/yashan -m yashan
[root@node ~]# usermod -a -G YASDBA yashan
[root@node ~]# echo "yashan" | passwd --stdin yashan
[root@node ~]# id yashan
uid=2001(yashan) gid=2002(yashan) groups=2002(yashan),2001(YASDBA)
## 配置 sudo 免密
[root@node ~]# ls -ltr /etc/sudoers
-r--r-----. 1 root root 4328 Mar 25  2020 /etc/sudoers
[root@node ~]# chmod +w /etc/sudoers
[root@node ~]# cat<<-EOF>>/etc/sudoers
> yashan ALL=(ALL)NOPASSWD:ALL
> EOF
[root@node ~]# chmod -w /etc/sudoers
[root@node ~]# ls -ltr /etc/sudoers
-r--r-----. 1 root root 4358 Nov 20 16:18 /etc/sudoers
[root@node ~]# 

创建目录

HOME 目录和 DATA 目录创建在 /data/yashan 下,yashan 用户需要对该目录拥有全部权限,可执行如下命令授权:

[root@node ~]# mkdir -p /data/yashan
[root@node ~]# chown -R yashan:yashan /data/yashan
[root@node ~]# chmod -R 770 /data/yashan

系统参数配置

[root@node ~]# echo "vm.swappiness=0" >> /etc/sysctl.conf
[root@node ~]# echo "net.ipv4.ip_local_port_range = 32768 60999" >>/etc/sysctl.conf
[root@node ~]# echo "vm.max_map_count=2000000" >>/etc/sysctl.conf
[root@node ~]# sysctl -p

资源配置

root@node ~]# cat<<-EOF>>/etc/security/limits.conf
> yashan soft nofile 1048576
> yashan hard nofile 1048576
> yashan soft nproc 1048576
> yashan hard nproc 1048576
> yashan soft rss unlimited
> yashan hard rss unlimited
> yashan soft stack 8192
> yashan hard stack 8192
> EOF
[root@node ~]#

关闭透明大页

[root@node ~]# cat /sys/kernel/mm/transparent_hugepage/enabled 
[always] madvise never
备注说明:
[always] madvise never:透明大页已开启。
always [madvise] never:透明大页已开启。
always madvise [never]:透明大页已关闭。

修改 /etc/default/grub 文件,在 GRUB_CMDLINE_LINUX 中添加或修改参数 transparent_hugepage=never,我这里的环境是虚拟机,和物理机上面装的系统GRUB_CMDLINE_LINUX参数显示的不一样,这里如下:

[root@node ~]# cat /etc/default/grub 
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial"
GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel_node1/root rd.lvm.lv=rhel_node1/swap transparent_hugepage=never console=ttyS0"
GRUB_DISABLE_RECOVERY="true"
[root@node ~]# 
重新配置下grub.cfg
[root@node ~]# 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-e22b02c7bae18cbb2f52a25df3c2a1ae
Found initrd image: /boot/initramfs-0-rescue-e22b02c7bae18cbb2f52a25df3c2a1ae.img
done
配置完成后重启下操作系统,使其配置永久生效
[root@node ~]# reboot
验证:
[root@node ~]# cat /sys/kernel/mm/transparent_hugepage/enabled 
always madvise [never]
[root@node ~]# 

开始安装

由于习惯使用命令行模式,所以演示也是使用命令行。不熟悉命令行的也可以选择使用图形界面安装。

[root@node ~]# mkdir -p /opt/yashan/install
[root@node ~]# chown -R yashan:root /opt/yashan/install
[root@node /]# su - yashan
[yashan@node ~]$ tar -zxvf yashandb-personal-23.3.1.100-linux-x86_64.tar.gz -C /opt/yashan/install/

生成安装配置文件

执行 yasboot package 命令生成配置文件:

##这里的IP地址信息根据自己的环境进行变更
[yashan@node install]$ ./bin/yasboot package se gen --cluster yashandb -u yashan -p yashan --ip 172.16.17.75 --port 22 --install-path /data/yashan/yasdb_home --data-path /data/yashan/yasdb_data --begin-port 1688
host host0001 openssl version: OpenSSL 1.1.1l  24 Aug 2021
OpenSSL version is 1.1.1 or greater
 hostid   | group | node_type | node_name | listen_addr       | replication_addr  | data_path               
------------------------------------------------------------------------------------------------------------
 host0001 | dbg1  | db        | 1-1       | 172.16.17.75:1688 | 172.16.17.75:1689 | /data/yashan/yasdb_data 
----------+-------+-----------+-----------+-------------------+-------------------+-------------------------

Generate config completed
执行完毕后,当前目录下将生成 yashandb.toml 和 hosts.toml 两个配置文件,在知晓参数含义的情况下可手动修改
[yashan@node install]$ ls -ltr
total 40
drwxrwxr-x 2 yashan yashan    61 Sep 30 14:40 scripts
drwxrwxr-x 4 yashan yashan    36 Sep 30 14:40 plug-in
-rw-r----- 1 yashan yashan 14989 Sep 30 14:40 LICENSE
drwxrwxr-x 2 yashan yashan  4096 Sep 30 14:40 lib
drwxrwxr-x 3 yashan yashan    17 Sep 30 14:40 java
drwxrwxr-x 2 yashan yashan    64 Sep 30 14:40 include
-rw-rw-r-- 1 yashan yashan 10854 Sep 30 14:40 gitmoduleversion.dat
drwxrwxr-x 4 yashan yashan    33 Sep 30 14:40 ext
drwxrwxr-x 2 yashan yashan   176 Sep 30 14:40 conf
drwxrwxr-x 2 yashan yashan   256 Sep 30 14:40 bin
drwxrwxr-x 7 yashan yashan    84 Sep 30 14:40 admin
drwxrwxr-x 2 yashan yashan    25 Nov 20 16:55 om
-rw------- 1 yashan yashan   454 Nov 20 16:55 hosts.toml
-rw------- 1 yashan yashan   743 Nov 20 16:55 yashandb.toml
备注:
yashandb.toml:数据库集群的配置文件。
hosts.toml:服务器的配置文

安装 yasom

[yashan@node install]$ ./bin/yasboot package install -t hosts.toml -i /home/yashan/yashandb-personal-23.3.1.100-linux-x86_64.tar.gz
host host0001 openssl version: OpenSSL 1.1.1l  24 Aug 2021
OpenSSL version is 1.1.1 or greater
checking install package...
install version: yashandb 23.3.1.100
host0001 100% [====================================================================]    6s
update host to yasom...

安装 yasagent

##安装部署 yasdb,-p指定的是 sys 用户密码
[yashan@node install]$ ./bin/yasboot cluster deploy -t yashandb.toml -p yasdb_123
 type | uuid             | name               | hostid | index    | status  | return_code | progress | cost 
------------------------------------------------------------------------------------------------------------
 task | d7dc0128b408c408 | DeployYasdbCluster | -      | yashandb | RUNNING | -           | 33       | -    
 type | uuid             | name               | hostid | index    | status  | return_code | progress | cost 
------------------------------------------------------------------------------------------------------------
 task | d7dc0128b408c408 | DeployYasdbCluster | -      | yashandb | SUCCESS | 0           | 100      | 24   
------+------------------+--------------------+--------+----------+---------+-------------+----------+------
task completed, status: SUCCESS

配置环境变量

[yashan@node install]$ cd /data/yashan/yasdb_home/yashandb/23.3.1.100/conf/
[yashan@node conf]$ ls -ltr
total 760
-rw-rw-r-- 1 yashan yashan   6408 Sep 30 14:40 yfs_options.json
-rw-rw-r-- 1 yashan yashan   7395 Sep 30 14:40 ycs_options.json
-rw-rw-r-- 1 yashan yashan 590524 Sep 30 14:40 yasreport.template
-rw-rw-r-- 1 yashan yashan  23577 Sep 30 14:40 sqlhtml.template
-rw-rw-r-- 1 yashan yashan   6836 Sep 30 14:40 sqlcollect.toml
-rw-rw-r-- 1 yashan yashan    297 Sep 30 14:40 profile.toml
-rw-rw-r-- 1 yashan yashan 125791 Sep 30 14:40 database_options.json
drwxrwxr-x 2 yashan yashan     73 Nov 20 17:05 monit
-rwx------ 1 yashan yashan    281 Nov 20 17:05 yashandb.bashrc
[yashan@node conf]$ cat yashandb.bashrc >>~/.bashrc 
[yashan@node conf]$ echo "alias ys='yasql / as sysdba'" >> ~/.bashrc
[yashan@node conf]$ source ~/.bashrc 

连接数据库

##系统认证方式登录
[yashan@node conf]$ yasql / as sysdba
YashanDB SQL Personal Edition Release 23.3.1.100 x86_64

Connected to:
YashanDB Server Personal Edition Release 23.3.1.100 x86_64 - Linux

SQL> 
##sys 密码登
  [yashan@node conf]$ yasql sys/yasdb_123@172.16.17.75:1688
YashanDB SQL Personal Edition Release 23.3.1.100 x86_64

Connected to:
YashanDB Server Personal Edition Release 23.3.1.100 x86_64 - Linux

SQL> 

创建用户

[yashan@node conf]$ yasql sys/yasdb_123@172.16.17.75:1688
YashanDB SQL Personal Edition Release 23.3.1.100 x86_64

Connected to:
YashanDB Server Personal Edition Release 23.3.1.100 x86_64 - Linux

SQL> create user test identified by test;
grant connect to test;
Succeed.

SQL> 

Succeed.

SQL> 

配置开机自启

##确保已启动 yasom 和 yasagent 进程
[yashan@node conf]$ ps -ef|grep yasom
yashan    3871     1  0 17:00 ?        00:00:00 /data/yashan/yasdb_home/yashandb/23.3.1.100/bin/yasom --init -c yashandb -l 172.16.17.75:1675 -k                  -d
yashan    5400  4417  0 17:15 pts/2    00:00:00 grep --color=auto yasom
[yashan@node conf]$ ps -ef|grep yasagent
yashan    3845     1  0 17:00 ?        00:00:00 /data/yashan/yasdb_home/yashandb/23.3.1.100/bin/yasagent --init -c yashandb -l 172.16.17.75:1676 --host-id host0001 -k                  -d
yashan    5412  4417  0 17:16 pts/2    00:00:00 grep --color=auto yasagent
[yashan@node conf]$ 
##如果yasom和yasagent没有启动,可以使用如下命令启动:
[yashan@node conf]$yasboot process yasom start -c yashandb
[yashan@node conf]$yasboot process yasagent start -c yashandb
##启动数据库
[yashan@node conf]$ yasboot cluster start -c yashandb
 type | uuid             | name              | hostid | index    | status  | return_code | progress | cost 
-----------------------------------------------------------------------------------------------------------
 task | b20779f30e121e97 | StartYasdbCluster | -      | yashandb | SUCCESS | 0           | 100      | 1    
------+------------------+-------------------+--------+----------+---------+-------------+----------+------
task completed, status: SUCCESS

##配置 YashanDB 启动守护进程
[yashan@node conf]$ yasboot monit start --cluster yashandb
 type | uuid             | name             | hostid | index    | status  | return_code | progress | cost 
----------------------------------------------------------------------------------------------------------
 task | 9dac03e4524a70f8 | MonitParentStart | -      | yashandb | SUCCESS | 0           | 100      | 1    
------+------------------+------------------+--------+----------+---------+-------------+----------+------
task completed, status: SUCCESS


配置开机自启动,需在 yasagent 进程所在服务器(即每台服务器)中执行以下操作:

[root@node ~]# cat<<-EOF>>/etc/rc.local
> su - yashan -c '/usr/bin/monit -c /data/yashan/yasdb_home/yashandb/23.3.1.100/ext/monit/monitrc'
> EOF
[root@node ~]# chmod a+x /etc/rc.d/rc.local 
[root@node ~]# cat /etc/rc.d/rc.local 
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
su - yashan -c '/usr/bin/monit -c /data/yashan/yasdb_home/yashandb/23.3.1.100/ext/monit/monitrc'
[root@node ~]#

查看数据库状态

[yashan@node ~]$ yasboot cluster status -c yashandb -d
 hostid   | node_type | nodeid | pid  | instance_status | database_status | database_role | listen_address    | source_node | data_path                      
-------------------------------------------------------------------------------------------------------------------------------------------------------------
 host0001 | db        | 1-1:1  | 1185 | open            | normal          | primary       | 172.16.17.75:1688 | -           | /data/yashan/yasdb_data/db-1-1 
----------+-----------+--------+------+-----------------+-----------------+---------------+-------------------+-------------+--------------------------------
[yashan@node ~]$ 

关闭数据库

[yashan@node ~]$ yasboot cluster stop -c yashandb
 type | uuid             | name             | hostid | index    | status  | return_code | progress | cost 
----------------------------------------------------------------------------------------------------------
 task | 3303b17133fd8877 | StopYasdbCluster | -      | yashandb | SUCCESS | 0           | 100      | 3    
------+------------------+------------------+--------+----------+---------+-------------+----------+------
task completed, status: SUCCESS
[yashan@node ~]$ ps -ef|grep yashandb
yashan     887     1  0 08:38 ?        00:00:02 /usr/bin/monit -c /data/yashan/yasdb_home/yashandb/23.3.1.100/ext/monit/monitrc
yashan     960     1  0 08:38 ?        00:00:00 /data/yashan/yasdb_home/yashandb/23.3.1.100/bin/yasom -c yashandb -l 172.16.17.75:1675 -d
yashan    1407     1  0 08:38 ?        00:00:00 /data/yashan/yasdb_home/yashandb/23.3.1.100/bin/yasagent -c yashandb -l 172.16.17.75:1676 -d
yashan    3074  2854  0 08:57 pts/0    00:00:00 grep --color=auto yashandb
[yashan@node ~]$ 

启动数据库

[yashan@node ~]$ yasboot cluster start -c yashandb
 type | uuid             | name              | hostid | index    | status  | return_code | progress | cost 
-----------------------------------------------------------------------------------------------------------
 task | bc516a505eb3dce5 | StartYasdbCluster | -      | yashandb | SUCCESS | 0           | 100      | 4    
------+------------------+-------------------+--------+----------+---------+-------------+----------+------
task completed, status: SUCCESS
[yashan@node ~]$ ps -ef|grep yashandb
yashan     887     1  0 08:38 ?        00:00:02 /usr/bin/monit -c /data/yashan/yasdb_home/yashandb/23.3.1.100/ext/monit/monitrc
yashan     960     1  0 08:38 ?        00:00:00 /data/yashan/yasdb_home/yashandb/23.3.1.100/bin/yasom -c yashandb -l 172.16.17.75:1675 -d
yashan    1407     1  0 08:38 ?        00:00:00 /data/yashan/yasdb_home/yashandb/23.3.1.100/bin/yasagent -c yashandb -l 172.16.17.75:1676 -d
yashan    3135     1 15 08:58 ?        00:00:01 /data/yashan/yasdb_home/yashandb/23.3.1.100/bin/yasdb open -D /data/yashan/yasdb_data/db-1-1
yashan    3228  2854  0 08:59 pts/0    00:00:00 grep --color=auto yashandb
[yashan@node ~]$

相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: