Linux自带神器logrotate怎么用(linux,logrotate,开发技术)

时间:2024-05-04 23:31:56 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

logrotate 程序是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用。可以节省磁盘空间。下面就对 logrotate 日志轮转操作做一梳理记录。
Linux自带神器logrotate怎么用

1、配置文件介绍

Linux系统默认安装logrotate工具,它默认的配置文件在:

/etc/logrotate.conf/etc/logrotate.d/

logrotate.conf 才主要的配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行。

另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。

Logrotate是基于CRON来运行的,其脚本是/etc/cron.daily/logrotate,日志轮转是系统自动完成的。实际运行时,Logrotate会调用配置文件/etc/logrotate.conf。可以在/etc/logrotate.d目录里放置自定义好的配置文件,用来覆盖Logrotate的缺省值。

[root@liangxu~]#cat/etc/cron.daily/logrotate#!/bin/sh/usr/sbin/logrotate/etc/logrotate.conf>/dev/null2>&1EXITVALUE=$?if[$EXITVALUE!=0];then/usr/bin/logger-tlogrotate"ALERTexitedabnormallywith[$EXITVALUE]"fiexit0

如果等不及cron自动执行日志轮转,想手动强制切割日志,需要加-f参数;不过正式执行前最好通过Debug选项来验证一下(-d参数),这对调试也很重要:

#/usr/sbin/logrotate-f/etc/logrotate.d/nginx#/usr/sbin/logrotate-d-f/etc/logrotate.d/nginx

logrotate 命令格式:

logrotate[OPTION...]-d,--debug:debug模式,测试配置文件是否有错误。-f,--force:强制转储文件。-m,--mail=command:压缩日志后,发送日志到指定邮箱。-s,--state=statefile:使用指定的状态文件。-v,--verbose:显示转储过程。

根据日志切割设置进行操作,并显示详细信息:

[root@liangxu~]#/usr/sbin/logrotate-v/etc/logrotate.conf[root@liangxu~]#/usr/sbin/logrotate-v/etc/logrotate.d/php

根据日志切割设置进行执行,并显示详细信息,但是不进行具体操作,debug模式

[root@liangxu~]#/usr/sbin/logrotate-d/etc/logrotate.conf[root@liangxu~]#/usr/sbin/logrotate-d/etc/logrotate.d/nginx

查看各log文件的具体执行情况

[root@liangxu~]#cat/var/lib/logrotate.status

2、切割介绍

比如以系统日志/var/log/message做切割来简单说明下:

  • 第一次执行完rotate(轮转)之后,原本的messages会变成messages.1,而且会制造一个空的messages给系统来储存日志;

  • 第二次执行之后,messages.1会变成messages.2,而messages会变成messages.1,又造成一个空的messages来储存日志!

如果仅设定保留三个日志(即轮转3次)的话,那么执行第三次时,则 messages.3这个档案就会被删除,并由后面的较新的保存日志所取代!也就是会保存最新的几个日志。

日志究竟轮换几次,这个是根据配置文件中的dateext 参数来判定的。

看下logrotate.conf配置:

#cat/etc/logrotate.conf#底下的设定是"logrotate的默认值",如果別的文件设定了其他的值,#就会以其它文件的设定为主weekly//默认每一周执行一次rotate轮转工作rotate4//保留多少个日志文件(轮转几次).默认保留四个.就是指定日志文件删除之前轮转的次数,0指没有备份create//自动创建新的日志文件,新的日志文件具有和原来的文件相同的权限;因为日志被改名,因此要创建一个新的来继续存储之前的日志dateext//这个参数很重要!就是切割后的日志文件以当前日期为格式结尾,如xxx.log-20131216这样,如果注释掉,切割出来是按数字递增,即前面说的xxx.log-1这种格式compress//是否通过gzip压缩转储以后的日志文件,如xxx.log-20131216.gz;如果不需要压缩,注释掉就行include/etc/logrotate.d#将/etc/logrotate.d/目录中的所有文件都加载进来/var/log/wtmp{//仅针对/var/log/wtmp所设定的参数monthly//每月一次切割,取代默认的一周minsize1M//文件大小超过1M后才会切割create0664rootutmp//指定新建的日志文件权限以及所属用户和组rotate1//只保留一个日志.}#这个wtmp可记录用户登录系统及系统重启的时间#因为有minsize的参数,因此不见得每个月一定会执行一次喔.要看文件大小。

由这个文件的设定可以知道/etc/logrotate.d其实就是由/etc/logrotate.conf 所规划出来的目录,虽然可以将所有的配置都写入 /etc/logrotate.conf ,但是这样一来这个文件就实在是太复杂了,尤其是当使用很多的服务在系统上面时, 每个服务都要去修改 /etc/logrotate.conf 的设定也似乎不太合理了。

所以,如果独立出来一个目录,那么每个要切割日志的服务, 就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中。

其他重要参数说明:

compress通过gzip压缩转储以后的日志nocompress不做gzip压缩处理copytruncate用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。nocopytruncate备份日志文件不过不截断createmodeownergroup轮转时指定创建新文件的属性,如create0777nobodynobodynocreate不建立新的日志文件delaycompress和compress一起使用时,转储的日志文件到下一次转储时才压缩nodelaycompress覆盖delaycompress选项,转储同时压缩。missingok如果日志丢失,不报错继续滚动下一个日志errorsaddress专储时的错误信息发送到指定的Email地址ifempty即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。notifempty当日志文件为空时,不进行轮转mailaddress把转储的日志文件发送到指定的E-mail地址nomail转储时不发送日志文件olddirdirectory转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统noolddir转储后的日志文件和当前日志文件放在同一个目录下sharedscripts运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本prerotate在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行postrotate在logrotate转储之后需要执行的指令,例如重新启动(kill-HUP)某个服务!必须独立成行daily指定转储周期为每天weekly指定转储周期为每周monthly指定转储周期为每月rotatecount指定日志文件删除之前转储的次数,0指没有备份,5指保留5个备份dateext使用当期日期作为命名格式dateformat.%s配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持%Y%m%d%s这四个参数size(或minsize)log-size当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB(sizek)或MB(sizem).当日志文件>=log-size的时候就转储。以下为合法格式:(其他格式的单位大小写没有试过)size=5或size5(>=5个字节就转储)size=100k或size100ksize=100M或size100M

小示例:下面一个切割nginx日志的配置

[root@liangxu~]#vim/etc/logrotate.d/nginx/usr/local/nginx/logs/*.log{dailyrotate7missingoknotifemptydateextsharedscriptspostrotateif[-f/usr/local/nginx/logs/nginx.pid];thenkill-USR1`cat/usr/local/nginx/logs/nginx.pid`fiendscript}

分享一例曾经使用过的nginx日志切割处理脚本:

1)logrotate日志分割配置

[root@bastion-IDC~#vim/etc/logrotate.d/nginx/data/nginx_logs/*.access_log{nocompressdailycopytruncatecreateifemptyolddir/data/nginx_logs/daysrotate0}

2)日志分割脚本

[root@bastion-IDC~#vim/usr/local/sbin/logrotate-nginx.sh#!/bin/bash#创建转储日志压缩存放目录mkdir-p/data/nginx_logs/days#手工对nginx日志进行切割转换/usr/sbin/logrotate-vf/etc/logrotate.d/nginx#当前时间time=$(date-d"yesterday"+"%Y-%m-%d")#进入转储日志存放目录cd/data/nginx_logs/days#对目录中的转储日志文件的文件名进行统一转换foriin$(ls./|grep"^\(.*\)\.[[:digit:]]$")domv${i}./$(echo${i}|sed-n's/^\(.*\)\.\([[:digit:]]\)$/\1/p')-$(echo$time)done#对转储的日志文件进行压缩存放,并删除原有转储的日志文件,只保存压缩后的日志文件。以节约存储空间foriin$(ls./|grep"^\(.*\)\-\([[:digit:]-]\+\)$")dotarjcvf${i}.bz2./${i}rm-rf./${i}done#只保留最近7天的压缩转储日志文件find/data/nginx_logs/days/*-name"*.bz2"-mtime7-typef-execrm-rf{}\;

3)crontab定时执行

[root@bastion-IDC~#crontab-e#logrotate00***/bin/bash-x/usr/local/sbin/logrotate-nginx.sh>/dev/null2>

手动执行脚本,测试下看看:

[root@bastion-IDC~#/bin/bash-x/usr/local/sbin/logrotate-nginx.sh[root@bastion-IDC~#cd/data/nginx_logs/days[root@bastion-IDCdays#lshuantest.access_log-2017-01-18.bz2

php脚本切割一例:

[root@liangxu~]#cat/etc/logrotate.d/php/Data/logs/php/*log{dailyrotate365missingoknotifemptycompressdateextsharedscriptspostrotateif[-f/Data/app/php5.6.26/var/run/php-fpm.pid];thenkill-USR1`cat/Data/app/php5.6.26/var/run/php-fpm.pid`fiendscriptpostrotate/bin/chmod644/Data/logs/php/*gzendscript}[root@liangxu~]#ll/Data/app/php5.6.26/var/run/php-fpm.pid-rw-r--r--1rootroot4Dec2817:03/Data/app/php5.6.26/var/run/php-fpm.pid[root@liangxu~]#cd/Data/logs/php[root@liangxuphp]#lltotal25676-rw-r--r--1rootroot0Jun12016error.log-rw-r--r--1nobodynobody182Aug302015error.log-20150830.gz-rw-r--r--1nobodynobody371Sep12015error.log-20150901.gz-rw-r--r--1nobodynobody315Sep72015error.log-20150907.gz..................

nginx日志切割一例

[root@liangxu~]#cat/etc/logrotate.d/nginx/Data/logs/nginx/*/*log{dailyrotate365missingoknotifemptycompressdateextsharedscriptspostrotate/etc/init.d/nginxreloadendscript}[root@liangxu~]#ll/Data/logs/nginx/www.huanqiu.com/..........-rw-r--r--1rootroot1652Jan100:00error.log-20170101.gz-rw-r--r--1rootroot1289Jan200:00error.log-20170102.gz-rw-r--r--1rootroot1633Jan300:00error.log-20170103.gz-rw-r--r--1rootroot3239Jan400:00error.log-20170104.gz

系统日志切割一例

[root@liangxu~]#cat/etc/logrotate.d/syslog/var/log/cron/var/log/maillog/var/log/messages/var/log/secure/var/log/spooler{sharedscriptspostrotate/bin/kill-HUP`cat/var/run/syslogd.pid2>/dev/null`2>/dev/null||trueendscript}[root@liangxu~]#ll/var/log/messages*-rw-------1rootroot34248975Jan1918:42/var/log/messages-rw-------1rootroot51772994Dec2503:11/var/log/messages-20161225-rw-------1rootroot51800210Jan103:05/var/log/messages-20170101-rw-------1rootroot51981366Jan803:36/var/log/messages-20170108-rw-------1rootroot51843025Jan1503:40/var/log/messages-20170115[root@liangxu~]#ll/var/log/cron*-rw-------1rootroot2155681Jan1918:43/var/log/cron-rw-------1rootroot2932618Dec2503:11/var/log/cron-20161225-rw-------1rootroot2939305Jan103:06/var/log/cron-20170101-rw-------1rootroot2951820Jan803:37/var/log/cron-20170108-rw-------1rootroot3203992Jan1503:41/var/log/cron-20170115[root@liangxu~]#ll/var/log/secure*-rw-------1rootroot275343Jan1918:36/var/log/secure-rw-------1rootroot2111936Dec2503:06/var/log/secure-20161225-rw-------1rootroot2772744Jan102:57/var/log/secure-20170101-rw-------1rootroot1115543Jan803:26/var/log/secure-20170108-rw-------1rootroot731599Jan1503:40/var/log/secure-20170115[root@liangxu~]#ll/var/log/spooler*-rw-------1rootroot0Jan1503:41/var/log/spooler-rw-------1rootroot0Dec1803:21/var/log/spooler-20161225-rw-------1rootroot0Dec2503:11/var/log/spooler-20170101-rw-------1rootroot0Jan103:06/var/log/spooler-20170108-rw-------1rootroot0Jan803:37/var/log/spooler-20170115

tomcat日志切割一例

[root@huanqiu-backup~]#cat/etc/logrotate.d/tomcat/Data/app/tomcat-7-huanqiu/logs/catalina.out{rotate14dailycopytruncatecompressnotifemptymissingok}[root@huanqiu-backup~]#ll/Data/app/tomcat-7-huanqiu/logs/catalina.*-rw-r--r--.1rootroot0Jan1919:11/Data/app/tomcat-7-huanqiu/logs/catalina.out-rw-r--r--.1rootroot95668Jan1919:11/Data/app/tomcat-7-huanqiu/logs/catalina.out.1.gz

早期用过的nginx日志处理一例

[root@letv-backup~]#vim/letv/sh/cut_nginx_log.sh#!/bin/bash#你的日志文件存放目录logs_path="/letv/logs/"#日志文件的名字,多个需要空格隔开logs_names=(erroraccesspv_access)dates=`date-d"yesterday"+"%Y%m%d"`mkdir-p${logs_path}$dates/num=${#logs_names[@]}for((i=0;i/dev/null2>$1

3、尝试解决logrotate无法自动轮询日志的办法

现象说明:

使用logrotate轮询nginx日志,配置好之后,发现nginx日志连续两天没被切割,这是为什么呢??

然后开始检查日志切割的配置文件是否有问题,检查后确定配置文件一切正常。

于是怀疑是logrotate预定的cron没执行,查看了cron的日志,发现有一条Dec 7 04:02:01 www crond[18959]: (root) CMD (run-parts /etc/cron.daily)这样的日志,证明cron在04:02分时已经执行/etc/cron.daily目录下的程序。

接着查看/etc /cron.daily/logrotate(这是logrotate自动轮转的脚本)的内容:

[root@huanqiu_test~]#cat/etc/cron.daily/logrotate#!/bin/sh/usr/sbin/logrotate/etc/logrotate.conf>/dev/null2>&1EXITVALUE=$?if[$EXITVALUE!=0];then/usr/bin/logger-tlogrotate"ALERTexitedabnormallywith[$EXITVALUE]"fiexit0

没有发现异常,配置好的日志轮转操作都是由这个脚本完成的,一切运行正常,脚本应该就没问题。

直接执行命令:

[root@huanqiu_test~]#/usr/sbin/logrotate/etc/logrotate.conf

这些系统日志是正常轮询了,但nginx日志却还是没轮询。

接着强行启动记录文件维护操作,纵使logrotate指令认为没有需要,应该有可能是logroate认为nginx日志太小,不进行轮询。

故需要强制轮询,即在/etc/cron.daily/logrotate脚本中将 -t 参数替换成 -f 参数

[root@huanqiu_test~]#cat/etc/cron.daily/logrotate#!/bin/sh/usr/sbin/logrotate/etc/logrotate.conf>/dev/null2>&1EXITVALUE=$?if[$EXITVALUE!=0];then/usr/bin/logger-flogrotate"ALERTexitedabnormallywith[$EXITVALUE]"fiexit

最后最后重启下cron服务:

[root@huanqiu_test~]#/etc/init.d/crondrestartStoppingcrond:[OK]Startingcrond:[OK]

logrotate默认自动切割生效时间

Logrotate是基于CRON来运行的,其脚本是/etc/cron.daily/logrotate,实际运行时,Logrotate会调用配置文件/etc/logrotate.conf。[root@test~]#cat/etc/cron.daily/logrotate#!/bin/sh/usr/sbin/logrotate/etc/logrotate.confEXITVALUE=$?if[$EXITVALUE!=0];then/usr/bin/logger-tlogrotate"ALERTexitedabnormallywith[$EXITVALUE]"fiexit0Logrotate是基于CRON运行的,所以这个时间是由CRON控制的,具体可以查询CRON的配置文件/etc/anacrontab(老版本的文件是/etc/crontab)[root@test~]#cat/etc/anacrontab#/etc/anacrontab:configurationfileforanacron#Seeanacron(8)andanacrontab(5)fordetails.SHELL=/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root#themaximalrandomdelayaddedtothebasedelayofthejobsRANDOM_DELAY=45//这个是随机的延迟时间,表示最大45分钟#thejobswillbestartedduringthefollowinghoursonlySTART_HOURS_RANGE=3-22//这个是开始时间#periodindaysdelayinminutesjob-identifiercommand15cron.dailynicerun-parts/etc/cron.daily725cron.weeklynicerun-parts/etc/cron.weekly@monthly45cron.monthlynicerun-parts/etc/cron.monthly第一个是Recurrenceperiod第二个是延迟时间所以cron.daily会在3:22+(5,45)这个时间段执行,/etc/cron.daily是个文件夹通过默认/etc/anacrontab文件配置,会发现logrotate自动切割日志文件的默认时间是凌晨3点多。==================================================================================================现在需要将切割时间调整到每天的晚上12点,即每天切割的日志是前一天的0-24点之间的内容。操作如下:[root@kevin~]#mv/etc/anacrontab/etc/anacrontab.bak//取消日志自动轮转的设置[root@G6-bs02logrotate.d]#catnstc_nohup.out/data/nstc/nohup.out{rotate30dateextdailycopytruncatecompressnotifemptymissingok}[root@G6-bs02logrotate.d]#catsyslog/var/log/cron/var/log/maillog/var/log/messages/var/log/secure/var/log/history{sharedscriptscompressrotate30dailydateextpostrotate/bin/kill-HUP`cat/var/run/syslogd.pid2>/dev/null`2>/dev/null||trueendscript}结合crontab进行自定义的定时轮转操作[root@kevin~]#crontab-l#loglogrotate5923***/usr/sbin/logrotate-f/etc/logrotate.d/syslog>/dev/null2>&15923***/usr/sbin/logrotate-f/etc/logrotate.d/nstc_nohup.out>/dev/null2>&1[root@G6-bs02~]#ll/data/nstc/nohup.out*-rw-------1appapp332181月2509:43/data/nstc/nohup.out-rw-------1appapp676781月2523:59/data/nstc/nohup.out-20180125.gz

除了利用自带的Logrotate工具实现日志切割之外,还可以编写python脚本或shell脚本以实现日志切割。下面就简单列出几个实例说明下:

一、Python脚本实现日志切割

实例1:对jumpserver日志进行切割[root@test-vm01mnt]#catlog_rotate.py#!/usr/bin/envpythonimportdatetime,os,sys,shutillog_path='/opt/jumpserver/logs/'log_file='jumpserver.log'yesterday=(datetime.datetime.now()-datetime.timedelta(days=1))try:os.makedirs(log_path+yesterday.strftime('%Y')+os.sep+\yesterday.strftime('%m'))exceptOSError,e:printprintesys.exit()shutil.move(log_path+log_file,log_path\+yesterday.strftime('%Y')+os.sep\+yesterday.strftime('%m')+os.sep\+log_file+'_'+yesterday.strftime('%Y%m%d')+'.log')os.popen("sudo/opt/jumpserver/service.shrestart")手动执行这个脚本:[root@test-vm01mnt]#chmod755log_rotate.py[root@test-vm01mnt]#pythonlog_rotate.py查看日志切割后的效果:[root@test-vm01mnt]#ls/opt/jumpserver/logs/2017jumpserver.log[root@test-vm01mnt]#ls/opt/jumpserver/logs/2017/09[root@test-vm01mnt]#ls/opt/jumpserver/logs/2017/09/jumpserver.log_20170916.log然后做每日的定时切割任务:[root@test-vm01mnt]#crontab-e301***/usr/bin/python/mnt/log_rotate.py>/dev/null2>&1--------------------------------------------------------------------------------------实例2:对nginx日志进行切割[root@test-vm01mnt]#vimlog_rotate.py#!/usr/bin/envpythonimportdatetime,os,sys,shutillog_path='/app/nginx/logs/'log_file='www_access.log'yesterday=(datetime.datetime.now()-datetime.timedelta(days=1))try:os.makedirs(log_path+yesterday.strftime('%Y')+os.sep+\yesterday.strftime('%m'))exceptOSError,e:printprintesys.exit()shutil.move(log_path+log_file,log_path\+yesterday.strftime('%Y')+os.sep\+yesterday.strftime('%m')+os.sep\+log_file+'_'+yesterday.strftime('%Y%m%d')+'.log')os.popen("sudokill-USR1`cat/app/nginx/logs/nginx.pid`")--------------------------------------------------------------------------------------其他业务日志的切割脚本跟上面做法相同

二、shell脚本实现日志切割

[root@qd-vpc-op-consumer01~]#cat/app/script/log_rotate.sh#!/bin/shfunctionrotate(){logs_path=$1echoRotatingLog:$1cp${logs_path}${logs_path}.$(date-d"yesterday"+"%Y%m%d")>${logs_path}rm-f${logs_path}.$(date-d"7daysago"+"%Y%m%d")}foriin$*dorotate$idone--------------------------------------------------------------------------------------------------------------每天定时切割日志的任务制定(比如对python的一个业务/data/log/xcspam/下的日志进行切割,0K的日志不进行切割):[root@qd-vpc-op-consumer01~]#crontab-e#xcspam日志切割300***find/data/log/xcspam/-size+0-name'*.log'|xargs/app/script/log_rotate.sh手动执行切割:[root@qd-vpc-op-consumer01~]#find/data/log/xcspam/-size+0-name'*.log'|xargs/app/script/log_rotate.sh切割后的日志效果:[root@qd-vpc-op-consumer01~]#ls/data/log/xcspam/xcspam_error.logxcspam_error.log-20170926--------------------------------------------------------------------------------------------------------------比如对maridb日志进行切割[root@qd-vpc-op-consumer01~]#crontab-e#xcspam日志切割300***find/var/log/mariadb/-size+0-name'*.log'|xargs/app/script/log_rotate.sh[root@qd-vpc-op-consumer01~]#find/var/log/mariadb/-size+0-name'*.log'|xargs/app/script/log_rotate.sh[root@qd-vpc-op-consumer01~]#ll/var/log/mariadb/总用量8-rw-r-----.1mysqlmysql09月1720:31mariadb.log-rw-r-----.1rootroot45329月1720:31mariadb.log.20170916--------------------------------------------------------------------------------------------------------------
日志压缩脚本:[root@localhost~]#ls/var/log/fss/nginx/nginx.20190506.lognginx.20190507.lognginx.20190508.log[root@localhost~]#cat/root/log_clean.sh#!/usr/bin/sh#根据系统/服务/日志保留天数三个参数压缩日志#usage:shclearlog.shsysnameappnamekeepdayssysName=$1appName=$2keepDay=$3logDir=/var/log/${sysName}/${appName}logFile=${appName}.*[0-9][0-9].logcd${logDir}find./-name"${logFile}"-mtime-${keepDay}-execgzip{}\;[root@localhost~]#sh/root/log_clean.shfssnginx3[root@localhost~]#ls/var/log/fss/nginx/nginx.20190506.log.gznginx.20190507.log.gznginx.20190508.log.gz还可以针对日志保留策略,调整成日志清理脚本。

推荐用的Nginx日志轮转方法 [部署在nginx的日志目录下]

#!/bin/bashyesterday=`date-d"-1days"+'%Y%m%d'`cd`dirname$0`basedir=`pwd`logdir="${basedir}/bak"bindir="${basedir%/*}/sbin"mkdir-p${logdir}forlogin`ls*.log2>/dev/null`domv${log}${logdir}/${log}.${yesterday}.bak#gzip${logdir}/${log}.${yesterday}done${bindir}/nginx-sreloadcd${logdir}find.-typef-name"*.bak"-mtime+7|xargsrm-f


 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Linux自带神器logrotate怎么用的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:MySQL的规范是怎样的下一篇:

14 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18