greenplum 自动导数工具
公司测试环境同步数据需求量巨大,每天都要导出大量生产数据到测试环境, 写了一个自动导数的工具,支持并行导出并自动导入到 测试环境,使用时需自己指定放有 导出过滤语句的文件,需放开生产到测试的网络环境。
#/bin/bash
source /usr/local/greenplum-db/greenplum_path.sh
export local_dir=/backup/csh
USAGE ()
{
echo ""
echo "Usage: -ds -dt -Ds -Dt -hs -ht -p -pt -us -ut -Us -Ut -f -w";
echo "Copydump Parameter Infomation: ";
echo " Parameter -ds: Source Database Name [源数据库名]";
echo " Parameter -dt: Target Database Name [目标数据库名]";
echo " Parameter -Ds: Source Outputfile Directory [源库数据输出路径]";
echo " Parameter -Dt: Target Copyfile Directory [目标库数据存放路径]";
echo " Parameter -hs: Source Database Host [源库主机IP地址]";
echo " Parameter -ht: Target Database Host [目标库主机IP地址]";
echo " Parameter -p: Source Database Port [源数据库端口号]";
echo " Parameter -pt: Target Database Port [目标数据库端口号]";
echo " Parameter -us: Source Database Username [源数据库用户名]";
echo " Parameter -ut: Target Database Username [目标数据库用户名]";
echo " Parameter -Us: Source Host Username [源库主机的用户名]";
echo " Parameter -Ut: Target Host Username [目标库主机的用户名]";
echo " Parameter -w: Workflow Number [工作流号]";
echo " Parameter -f: Copy SQLFile Directory,Default Value: /backup/csh/copysql.sql [源库copysql文件路径]";
echo " Parameter -pa: Parallel Processes [并行度]";
echo ""
echo " EasyMode: [简易模式:]";
echo " run (copydump 87) can copy data to 192.168.218.87 ['copydump 87'可拷贝数据至开发库]";
echo " run (copydump 163) can copy data to 192.168.218.163 ['copydump 163'可拷贝数据至开发库]";
echo "";
exit 1;
}
if [ $# -lt 2 ]
then
if [ x"$1" == x"87" ]
then
export source_database=dp_bidb
export target_database=dp_dev
export source_ip=10.249.15.22
export target_ip=192.168.218.87
export source_hostuser=gpadmin
export target_hostuser=gpadmin
export source_dbuser=gpadmin
export target_dbuser=gpadmin
export source_port=9432
export target_port=5432
export source_dir=/data2/copy
export target_dir=/u01/csh
echo ""
read -p "Now Input the Workflow Number: " num
if [ x"$num" == x"" ]
then
echo "You Must Input the Workflow Number! Run 'copydump --help' to Get Usage"
echo ""
exit
else
export jira_num="$num"
fi
echo ""
read -p "Now Input Your SQLFile Directory( Default SQLFile is $local_dir/copysql.sql ): " dir
if [ x"$dir" == x"" ]
then
export sql_text=$local_dir/copysql.sql
else
export sql_text="$dir"
fi
echo ""
read -p "Now Input Copy Parallel Processes( Default Parallel is 4 ): " par
if [ x"$par" == x"" ]
then
export parallel=4
else
export parallel="$par"
fi
elif [ x"$1" == x"163" ]
then
export source_database=dp_bidb
export target_database=dp_dw163
export source_ip=10.249.15.22
export target_ip=192.168.218.163
export source_hostuser=gpadmin
export target_hostuser=sgpadmin
export source_dbuser=gpadmin
export target_dbuser=sgpadmin
export source_port=9432
export target_port=6432
export source_dir=/data2/copy
export target_dir=/data1/csh
echo ""
read -p "Now Input the Workflow Number: " num
if [ x"$num" == x"" ]
then
echo "You Must Input the Workflow Number! Run 'copydump --help' to Get Usage"
echo ""
exit
else
export jira_num="$num"
fi
echo ""
read -p "Now Input Your SQLFile Directory( Default SQLFile is $local_dir/copysql.sql ): " dir
if [ x"$dir" == x"" ]
then
export sql_text=$local_dir/copysql.sql
else
export sql_text="$dir"
fi
echo ""
read -p "Now Input Copy Parallel Processes( Default Parallel is 4 ): " par
if [ x"$par" == x"" ]
then
export parallel=4
else
export parallel="$par"
fi
else
USAGE
fi
else
export sql_text=""
export source_database=""
export target_database=""
export source_ip=""
export target_ip=""
export source_hostuser=""
export target_hostuser=""
export source_dbuser=""
export target_dbuser=""
export source_port=""
export target_port=""
export source_dir=""
export target_dir=""
export jira_num=""
while getopts ds:dt:Ds:Dt:hs:ht:p:pa:pt:us:ut:Us:Ut:f:w OPTION ;
do
case "$OPTION" in
ds) source_database="$OPTARG" ;;
dt) target_database="$OPTARG" ;;
Ds) source_dir="$OPTARG" ;;
Dt) target_dir="$OPTARG" ;;
hs) source_ip="$OPTARG" ;;
ht) target_ip="$OPTARG" ;;
p) source_port="$OPTARG" ;;
pa) parallel="$OPTARG" ;;
pt) target_port="$OPTARG" ;;
us) source_dbuser="$OPTARG" ;;
ut) target_dbuser="$OPTARG" ;;
Us) source_hostuser="$OPTARG" ;;
Ut) target_hostuser="$OPTARG" ;;
f) sql_text="$OPTARG" ;;
w) jira_num="$OPTARG" ;;
\?) #usage statement
USAGE;
;;
esac
done
if [ x"$source_database" == x"" ]
then
echo "-ds Source Database Name Must be Specified , Run 'copydump --help' to Get Usage"
echo ""
exit
fi
if [ x"$target_database" == x"" ]
then
echo "-dt Target Database Name Must be Specified , Run 'copydump --help' to Get Usage"
echo ""
exit
fi
if [ x"$source_dir" == x"" ]
then
echo "-Ds Source Outputfile Directory Must be Specified , Run 'copydump --help' to Get Usage"
echo ""
exit
fi
if [ x"$target_dir" == x"" ]
then
echo "-Dt Target Outputfile Directory Must be Specified , Run 'copydump --help' to Get Usage"
echo ""
exit
fi
if [ x"$source_ip" == x"" ]
then
echo "-hs Source Database Host Must be Specified , Run 'copydump --help' to Get Usage"
echo ""
exit
fi
if [ x"$target_ip" == x"" ]
then
echo "-ht Target Database Host Must be Specified , Run 'copydump --help' to Get Usage"
echo ""
exit
fi
if [ x"$parallel" == x"" ]
then
echo "-pa Target Database Parallel Default Value is 4 "
export parallel=4
else
export parallel="$parallel"
fi
if [ x"$source_port" == x"" ]
then
echo "-p Source Database Port Must be Specified , Run 'copydump --help' to Get Usage"
echo ""
exit
fi
if [ x"$target_port" == x"" ]
then
echo "-pt Target Database Port Must be Specified , Run 'copydump --help' to Get Usage"
echo ""
exit
fi
if [ x"$source_dbuser" == x"" ]
then
echo "-us Source Database Username Must be Specified , Run 'copydump --help' to Get Usage"
echo ""
exit
fi
if [ x"$target_dbuser" == x"" ]
then
echo "-ut Target Database Username Must be Specified , Run 'copydump --help' to Get Usage"
echo ""
exit
fi
if [ x"$source_hostuser" == x"" ]
then
echo "-Us Source Host Username Must be Specified , Run 'copydump --help' to Get Usage"
echo ""
exit
fi
if [ x"$target_hostuser" == x"" ]
then
echo "-Ut Target Host Username Must be Specified , Run 'copydump --help' to Get Usage"
echo ""
exit
fi
if [ x"$sql_text" == x"" ]
then
echo "-f Copy SQLFile Directory Must be Specified , Run 'copydump --help' to Get Usage"
echo ""
exit
fi
if [ x"$jira_num" == x"" ]
then
echo "-w Workflow Number Must be Specified , Run 'copydump --help' to Get Usage"
echo ""
exit
fi
fi
#开始复制程序
echo '--------------------------------------------------------------------'
echo ""
echo 'Use ('$sql_text') Copy Data From ('$source_ip'):('$source_database') To ('$target_ip'):('$target_database')'
read -p "Do You Want To Continue ? Please Input (yes\no): " char
if [ "$char" == "yes" ]
then
echo ""
mkdir -p $local_dir/$jira_num
#copy源库数据到指定文件夹下
while read line
do
#获取表名
export table_nm=`echo "$line" | awk '{print $4}'`
echo `date` > $local_dir/copy_error.log 2>&1
#判断查询脚本是否可执行
psql -d "$source_database" -p "$source_port" -h "$source_ip" -U "$source_dbuser" -c " copy ( ${line} limit 1 ) to stdout " >> $local_dir/copy_error.log 2>&1
if [ $? -eq 0 ]
then
echo $jira_num': Test Copy Table '$table_nm' Successfully ' >> $local_dir/copy.log
else
#不可执行抛出异常
echo `date` >> $local_dir/copy.log
echo $jira_num':Test Copy Table '$table_nm' With Error,Check /data1/csh/copy_error.log For More Information' >> $local_dir/copy.log
echo ""
echo '########################################################################################'
echo 'Copy Table '$table_nm' With Error !!! Cat '$local_dir'/copy_error.log For More Information'
echo '########################################################################################'
echo ""
exit
fi
done < $sql_text
if [ "$?" != 0 ]
then
exit
fi
#开并行
i=1
n=`cat "$sql_text" | wc -l`
if [ $n -lt $parallel ]
then
export parallel="$n"
fi
while [ $i -le $n ]
do
scopy()
{
line=`head -n $i $sql_text | tail -n 1`
typeset -l tab
tab="$line"
table_name=`echo "$tab" | awk '{print $4}'`
echo `date` >> $local_dir/copy.log
echo $jira_num': Copy Table '$table_name' Start ' >> $local_dir/copy.log
psql -d $source_database -p $source_port -h $source_ip -U $source_dbuser -c " copy (${tab}) to stdout " | gzip > $local_dir/$jira_num/$table_name.gz
echo `date` >> $local_dir/copy.log
echo 'Copy Table '$table_name
echo $jira_num': Copy Table '$table_name' Successfully ' >> $local_dir/copy.log
}
m=1
while [ $m -le $parallel ]
do
scopy &
i=`expr $i + 1`
m=`expr $m + 1`
done
while [ 1 == 1 ]
do
copy_num=`ps -ef | grep -i copy | grep -v grep | wc -l`
if [ $copy_num -gt 2 ]
then
sleep 1
else
break
fi
done
done
wait
#while read name
#do
#typeset -l tab
#tab="$name"
#export table_name=`echo "$tab" | awk '{print $4}'`
#echo `date` >> $local_dir/copy.log
#echo $jira_num': copy table '$table_name' start ' >> $local_dir/copy.log
#psql -d $source_database -p $source_port -h $source_ip -U $source_dbuser -c " copy (${tab}) to stdout " | gzip > $local_dir/$jira_num/$table_name.gz
#echo `date` >> $local_dir/copy.log
#echo 'copy table '$table_name
#echo $jira_num': copy table '$table_name' successfully ' >> $local_dir/copy.log
#done < $sql_text
#把导出的数据库文件传至58中间库
#echo ""
#echo 'Now Scp the Copy File to 192.168.5.58 !'
#echo '--------------------------------------------------------------------'
#echo ""
#scp -r $source_hostuser@$source_ip:$source_dir/$jira_num $local_dir
#if [ "$?" -eq 0 ]
#then
# echo `date` >> $local_dir/copy.log
# echo $jira_num': Copy File to 192.168.5.58 Start ' >> $local_dir/copy.log
#else
# echo ""
# echo 'scp file to 192.168.5.58 faild,check your password! and run this commond to continue: sh /tmp/scp_error/continue.sh' | tee -a $local_dir/copy.log
# echo ""
# exit
#fi
#echo `date` >> $local_dir/copy.log
#echo $jira_num': copy file to 192.168.5.58 end ' >> $local_dir/copy.log
#把导出的数据文件复制到目标库
echo ""
echo 'Now Scp The Copy File To '$target_ip' !'
echo '--------------------------------------------------------------------'
echo ""
smakdir(){
echo "#!/usr/bin/expect" > $local_dir/spawn_makdir.sh
echo "set password sgpadmin" >> $local_dir/spawn_makdir.sh
echo "spawn ssh $target_hostuser@$target_ip" >> $local_dir/spawn_makdir.sh
echo 'expect {' >> $local_dir/spawn_makdir.sh
echo '"*yes/no" { send "yes\r"; exp_continue}' >> $local_dir/spawn_makdir.sh
echo '"*password:" { send "$password\r" }' >> $local_dir/spawn_makdir.sh
echo '}' >> $local_dir/spawn_makdir.sh
echo 'expect "]$ "' >> $local_dir/spawn_makdir.sh
echo "send \"mkdir -p $target_dir/$jira_num\r\"" >> $local_dir/spawn_makdir.sh
echo 'send "exit\r"' >> $local_dir/spawn_makdir.sh
echo "expect eof" >> $local_dir/spawn_makdir.sh
chmod a+x $local_dir/spawn_makdir.sh
cd $local_dir
./spawn_makdir.sh
}
smakdir
i=1
n=`cat "$sql_text" | wc -l`
if [ $n -lt $parallel ]
then
export parallel="$n"
fi
while [ $i -le $n ]
do
sscp(){
echo "#!/usr/bin/expect" > $local_dir/spawn_scp$i.sh
echo "set password sgpadmin" >> $local_dir/spawn_scp$i.sh
echo "set timeout 100000000" >> $local_dir/spawn_scp$i.sh
echo "spawn scp $local_dir/$jira_num/$table_name.gz $target_hostuser@$target_ip:$target_dir/$jira_num" >> $local_dir/spawn_scp$i.sh
echo 'expect {' >> $local_dir/spawn_scp$i.sh
echo '"*yes/no" { send "yes\r"; exp_continue}' >> $local_dir/spawn_scp$i.sh
echo '"*password:" { send "$password\r" }' >> $local_dir/spawn_scp$i.sh
echo '}' >> $local_dir/spawn_scp$i.sh
echo "expect eof" >> $local_dir/spawn_scp$i.sh
chmod a+x $local_dir/spawn_scp$i.sh
cd $local_dir
./spawn_scp$i.sh
rm $local_dir/spawn_scp$i.sh
}
m=1
while [ $m -le $parallel ]
do
line=`head -n $i $sql_text | tail -n 1`
typeset -l tab
tab="$line"
table_name=`echo "$tab" | awk '{print $4}'`
sscp &
i=`expr $i + 1`
m=`expr $m + 1`
done
while [ 1 == 1 ]
do
scp_num=`ps -ef | grep -i scp | grep -v grep | wc -l`
if [ $scp_num -gt 2 ]
then
sleep 1
else
break
fi
done
done
wait
if [ "$?" -eq 0 ]
then
echo `date` >> $local_dir/copy.log
echo $jira_num': Copy File To '$target_ip' Start ' >> $local_dir/copy.log
else
echo $jira_num': Copy File To '$target_ip' Error ' >> $local_dir/copy.log
mkdir -p /tmp/scp_error/
echo ""
echo 'Scp File To '$target_ip' Faild,Check Your Password! And Run This Commond To Continue: sh /tmp/scp_error/continue.sh' | tee -a $local_dir/copy.log
echo ""
exit
fi
echo `date` >> $local_dir/copy.log
echo $jira_num': Copy File To '$target_ip' End ' >> $local_dir/copy.log
#解压导出的数据文件
echo ""
echo 'Now Gunzip The Copy File !'
echo '--------------------------------------------------------------------'
echo ""
i=1
n=`cat "$sql_text" | wc -l`
if [ $n -lt $parallel ]
then
export parallel="$n"
fi
while [ $i -le $n ]
do
sgunzip(){
echo "#!/usr/bin/expect" > $local_dir/spawn_gunzip$i.sh
echo "set password sgpadmin" >> $local_dir/spawn_gunzip$i.sh
echo "spawn ssh $target_hostuser@$target_ip" >> $local_dir/spawn_gunzip$i.sh
echo 'expect {' >> $local_dir/spawn_gunzip$i.sh
echo '"*yes/no" { send "yes\r"; exp_continue}' >> $local_dir/spawn_gunzip$i.sh
echo '"*password:" { send "$password\r" }' >> $local_dir/spawn_gunzip$i.sh
echo '}' >> $local_dir/spawn_gunzip$i.sh
echo 'expect "]$ "' >> $local_dir/spawn_gunzip$i.sh
echo "send \"gunzip -f $target_dir/$jira_num/$table_name.gz\r\"" >> $local_dir/spawn_gunzip$i.sh
echo 'send "exit\r"' >> $local_dir/spawn_gunzip$i.sh
echo 'expect eof' >> $local_dir/spawn_gunzip$i.sh
chmod a+x $local_dir/spawn_gunzip$i.sh
cd $local_dir
./spawn_gunzip$i.sh
rm $local_dir/spawn_gunzip$i.sh
}
m=1
while [ $m -le $parallel ]
do
line=`head -n $i $sql_text | tail -n 1`
typeset -l tab
tab="$line"
table_name=`echo "$tab" | awk '{print $4}'`
sgunzip &
i=`expr $i + 1`
m=`expr $m + 1`
done
while [ 1 == 1 ]
do
gunzip_num=`ps -ef | grep -i gunzip | grep -v grep | wc -l`
if [ $gunzip_num -gt 2 ]
then
sleep 1
else
break
fi
done
done
wait
if [ "$?" -eq 0 ]
then
echo `date` >> $local_dir/copy.log
echo $jira_num': '$target_ip' Gunzip File Start ' >> $local_dir/copy.log
else
echo $jira_num': Copy File To '$target_ip' Error ' >> $local_dir/copy.log
mkdir -p /tmp/gunzip_error/
echo ""
echo 'Gunzip File On '$target_ip' Faild,Check Your Password! And Run This Commond To Continue: sh /tmp/gunzip_error/continue.sh' | tee -a $local_dir/copy.log
echo ""
exit
fi
echo `date` >> $local_dir/copy.log
echo $jira_num': '$target_ip' Gunzip File End ' >> $local_dir/copy.log
#操作目标库导入数据
echo ""
echo 'Now Copy Data To '$target_ip':'$target_database
echo '--------------------------------------------------------------------'
echo ""
echo `date` >> $local_dir/copy.log
echo $jira_num': Copy Data To '$target_database' Start' >> $local_dir/copy.log
i=1
n=`cat "$sql_text" | wc -l`
if [ $n -lt $parallel ]
then
export parallel="$n"
fi
while [ $i -le $n ]
do
tcopy(){
LINE=`head -n $i $sql_text | tail -n 1`
typeset -l tab
tab="$LINE"
table=`echo "$tab" | awk '{print $4}'`
where=`echo "$tab" | awk '{print $5}'`
#判断是否全表导出
if [ x"$where" == x"where" ]
then
#不是全表,先拼接删除语句
export delete="${LINE/select \* from/delete from}"
echo `date` >> $local_dir/copy.log
echo $jira_num': '"$delete" >> $local_dir/copy.log
#删除数据
echo "$delete"
psql -d $target_database -h $target_ip -U $target_dbuser -p $target_port -c "$delete" 2>&1 | tee -a $local_dir/copy.log
#导入数据
echo `date` >> $local_dir/copy.log
export copy="copy $table from '$target_dir/$jira_num/$table'"
echo "$copy"
echo ""
echo $jira_num': '"$copy" >> $local_dir/copy.log
psql -d $target_database -h $target_ip -U $target_dbuser -p $target_port -c "$copy" 2>&1 | tee -a $local_dir/copy.log
#确认数据
#echo `date` >> $local_dir/copy.log
#export select="${LINE/select \* from/select count(1) from}"
#echo $jira_num': '"$select" >> $local_dir/copy.log
#psql -d $target_database -h $target_ip -U $target_dbuser -p $target_port -c "$select" 2>&1 >> $local_dir/copy.log
#全表导出先truncate表
else
export truncate="truncate table $table"
echo `date` >> $local_dir/copy.log
echo "$truncate"
echo $jira_num': '"$truncate" >> $local_dir/copy.log
psql -d $target_database -h $target_ip -U $target_dbuser -p $target_port -c "$truncate" 2>&1 | tee -a $local_dir/copy.log
#导入数据
echo `date` >> $local_dir/copy.log
export copy="copy $table from '$target_dir/$jira_num/$table'"
echo "$copy"
echo ""
echo $jira_num': '"$copy" >> $local_dir/copy.log
psql -d $target_database -h $target_ip -U $target_dbuser -p $target_port -c "$copy" 2>&1 | tee -a $local_dir/copy.log
#确认数据
#echo `date` >> $local_dir/copy.log
#export select="${LINE/select \* from/select count(1) from}"
#echo $jira_num': '"$select" >> $local_dir/copy.log
#psql -d $target_database -h $target_ip -U $target_dbuser -p $target_port -c "$select" 2>&1 >> $local_dir/copy.log
fi
}
m=1
while [ $m -le $parallel ]
do
tcopy &
i=`expr $i + 1`
m=`expr $m + 1`
done
while [ 1 == 1 ]
do
copy_num=`ps -ef | grep -i copy | grep -v grep | wc -l`
if [ $copy_num -gt 2 ]
then
sleep 1
else
break
fi
done
done
wait
echo ""
echo '##########################################################'
echo 'Copy Data To '$target_ip $target_database' End'
echo '##########################################################'
echo ""
echo `date` >> $local_dir/copy.log
echo $jira_num': Copy Data To '$target_ip $target_database' End' >> $local_dir/copy.log
echo '----------------------------------------------------------' >> $local_dir/copy.log
echo "" >> $local_dir/copy.log
else
echo ""
echo '##########################################################'
echo 'Copydump End With Do Nothing , Check Your Parameter !'
echo '##########################################################'
echo ""
fi
greenplum 自动导数工具相关推荐
- js 刷新页面但是不闪烁_前端开发还在手动刷新页面?手把手教你搭建一个自动刷新工具...
作为一名前端,开发web页面是我们的本职工作.在完成一个页面开发的过程中,保存代码然后手动刷新页面查看效果,这样的动作需要重复无数次,虽然一次这样的动作可能只要花费几秒钟的时间,但是次数多了也挺浪费时 ...
- iOS应用模块化的思考及落地方案(二)模块化自动构建工具的使用
1.0 iOS模块化中的问题 前文已经介绍了模块化的流程及一些常见的问题,我们在这里再次总结一下. 在工作中,当我们开始一个新项目的时候,最先考虑的就是模块化工作. 模块化工作的想法是很美好的,可是执 ...
- 开源交互式自动标注工具EISeg
在人工智能行业有这么一句话:"深度学习有多智能.背后就有多少人工".这句话直接说出了深度学习从业者心中的痛处,毕竟模型的好坏数据占着很大的因素,但是数据的标注成本却让很多从业者感到 ...
- 微软开源的自动机器学习工具上新了:NNI概览及新功能详解
作者 | 宋驰 来源 | 微软研究院AI头条(ID: MSRAsia) 2018年9月,微软亚洲研究院发布了第一版 NNI (Neural Network Intelligence) ,目前已在 Gi ...
- 20120520 Linux下mysql的自动备份工具
文章摘自:http://hi.baidu.com/vb98/blog/item/2ed90cea835fa4cfd439c97f.html linux下的MySQL自动备份工具-第二版2011-10- ...
- 开源!开源!我写的Anto.exe C#代码自动生成工具.欢迎下载。。
在开发的过程中开发人员不得不经常要写很多重复的代码, 为了把精力放到更重要的方面去很多人为都做了N多努力,随便google一下自动生成工具, 你都会很容易得到很多这样的工具.园子就有好几款,其中李天平 ...
- python词云去除词_使用Python制作一个带GUI界面的词云自动生成工具(连载五)
上一篇中我们介绍了自动生成词云工具(GUI)中数据清洗界面的实现过程(详解词云自动生成工具的数据清洗界面制作过程(连载四)),了解掌握了Grid.Pack混合布局的方法.本篇我们将讨论Python自动 ...
- WEP自动破解工具wesside-ng
WEP自动破解工具wesside-ng wesside-ng是aircrack-ng套件提供的一个概念验证工具.该工具可以自动扫描无线网络,发现WEP加密的AP.然后,尝试关联该AP.关联成功后,它会 ...
- python代码规范 自动优化工具Black
自动优化工具Black 在众多代码格式化工具中,Black算是比较新的一个,它***的特点是可配置项比较少,个人认为这对于新手来说是件好事,因为我们不必过多考虑如何设置Black,让 Black 自己 ...
最新文章
- 利用Attribute简化Unity框架IOC注入
- 5.5 准备创建bean
- 企业应用单svn与apache+svn配置整理
- python回测函数_Python事件化回测双均线
- java求两点坐标间的距离
- vs2015中提示未能找到类型或命名空间名Word
- javaGUI学习47:Swing-进度条、滑杆和分隔条
- EF Core 批量写入数据使用整理_EF Core批量插入数据(一)
- Mac全自动安装brew一键配置国内镜像源
- 关于以太坊 雷电网络 的思考
- 2017百度世界大会 | 爱奇艺创始人CEO龚宇演讲速记
- WIN10 LTSC 安装EDGE和微软应用商店
- dcp9020cdn可以打印a3纸吗_印品质量 细节对比_兄弟 9020CDN_办公打印评测试用-中关村在线...
- Springboot实现过滤器
- yum配置文件 重启后还原_电脑里重启后,重启前所有设置都还原到以前了,怎么办啊...
- 2019杭电多校第七场 HDU - 6656 Kejin Player 期望
- Linux--装好之后要做的几件事(转)
- Linux 中查看网卡是否启用
- 提示计算机类型不匹配啥意思,提示:运行时错误“13”:类型不匹配。是什么意思刚装好...
- python中文乱码总结