mysql自动化安装脚本(二进制安装)
为了日后安装数据库方便,遂写了一个自动安装MySQL的脚本:
测试可以安装mariadb和MySQL-5.7.X
安装前配置好对应的my.cnf文件放在/tmp路径下
将启动脚本mysql3306放在/usr/local/下
将安装包放在/usr/local路径下
安装方式为:./install_mysql.sh mysql-5.7.20 3306 # 第一个参数为数据库版本(格式统一),第二个参数为端口号,两个参数都可以根据自己情况修改
数据库启动/关闭为:service mysql3306 start/stop/restart/status
下面分别为安装脚本install_mysql.sh、启动脚本mysql3306、配置文件my.cnf
#!/bin/bash
############ Install MySQL############ export LANG=C
export LC_ALL=C #Set the LANG and all environment variable beginning with LC_ to C
typeset -r version=$
typeset -r port=$ # DEFINED VAR START
typeset -r softwaredir="/usr/local"
typeset -r basedir="/usr/local/mysql" #input version of server
typeset -r databasedir="/data/${port}"
typeset -r datadir="${databasedir}/data"
typeset -r logdir="${databasedir}/log"
typeset -r mysqluser="mysql"
typeset -r defaults_file="${databasedir}/my.cnf"
typeset -r mysqldautostartfile="/etc/rc.d/init.d/mysql${port}"
typeset -r pidfile="${databasedir}/mysql.pid"
typeset -r socketlink="${databasedir}/mysql.sock"
typeset timestamp=''
typeset sInsDir_G=''
typeset sLogDir_G=''
typeset sLog_G='' #DEFINED ENV START
export PATH=/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:$PATH
#DEFINED ENV END ## -------------------- init global vars -------------------
sInsDir_G=$( echo $(basename $) | awk -F. '{print $1}' )
if [ -z "${sLog_G}" ]; then
sLog_G="/backup/SysMgtScripts/Log/${sInsDir_G}/$( hostname ).log"
fi
if [ -z "${sLogDir_G}" ]; then
sLogDir_G=${sLog_G%/*}
fi
if [ ! -d ${sLogDir_G} ]; then
mkdir -p ${sLogDir_G}
fi
## --------------------------------------------------------- export sLog_G
export sLogDir_G ## ensure the directory structure exists
BASEDIR="/backup/SysMgtScripts/"
if [ ! -d $BASEDIR ]; then
mkdir -p ${BASEDIR}/Log
fi ## -------------------- colourful print --------------------
rMsg () { echo -e "\033[031;1m$@\033[0m"; }
gMsg () { echo -e "\033[032;1m$@\033[0m"; }
yMsg () { echo -e "\033[033;1m$@\033[0m"; } ## normal message print and log
LogMsg()
{
local timestamp=$( date '+%F %T' )
gMsg "[${timestamp}]: $*"
printf "[%s]:%s\n" "${timestamp}" "$*" >> "${sLog_G}"
} # warning
Warn()
{
local timestamp=$( date '+%F %T' )
yMsg "[${timestamp}]: $*"
printf "[%s]:%s\n" "${timestamp}" "$*" >> "${sLog_G}"
} # error
Error()
{
local retval=$?
local timestamp=$( date '+%F %T' )
rMsg "[${timestamp}]: $*"
printf "[%s]:%s\n" "${timestamp}" "$*" >> "${sLog_G}"
exit $?
} #Check mysql user exit or not.
CheckUser(){
cat /etc/passwd |grep mysql &>/dev/null
if [ $? -ne 0 ];then
Warn "user ${mysqluser} not exist"
useradd ${mysqluser} || Error "Create MySQL user Failed"
else
LogMsg "user ${mysqluser} exist"
fi
} #Create dir for database
InitDirs(){
list="${databasedir} ${datadir} ${logdir}"
for i in $list;
do
if [ ! -d $i ];then
Warn "Missing directory $i "
mkdir -p $i || Error "Fail to create directory $i"
LogMsg "$i create successfully"
fi Test_Owner_T=`ls -l -d $i |awk '{print $3}'`
if [[ "${Test_Owner_T}" != "${mysqluser}" ]];then
chown -R ${mysqluser}:${mysqluser} $i || Error "Fail to change the directory owner"
fi
done
} InitEnv(){
bashrc="/etc/profile"
Test_Env_T=`cat ${bashrc} |grep "${basedir}"`
if [[ "${Test_Env_T}" != "" ]];then
LogMsg "${basedir} is already exists in ${bashrc}"
else
MYSQL_HOME=${basedir}
echo "MYSQL_HOME=${basedir}" >> ${bashrc} || Error "Fail to init environment"
echo "export PATH=\$PATH:${MYSQL_HOME}/bin" >> ${bashrc}
LogMsg "Add MYSQL_HOME to /etc/profile"
fi
source /etc/profile
} SetMycnf(){
cp /tmp/my.cnf ${defaults_file} || Error "Fail to create my.cnf" if [[ ! -f "/etc/my.cnf" ]];then
LogMsg "The Parameter File is OK"
else
mv /etc/my.cnf /etc/my.cnf.bak
LogMsg "removed /etc/my.cnf to /etc/my.cnf.bak"
fi
} UnzipPackages() {
Mysql_Package=`find ${softwaredir} -name ${version}*.tar.gz`
if [[ ! -f ${Mysql_Package} ]];then
Error "MySQL Install Package is not found"
else
Mysql_File=`find ${softwaredir} -name ${version}*.tar.gz -exec basename {} .tar.gz \;`
if [[ ! -d "/usr/local/${Mysql_File}" ]];then
LogMsg "unzip MySQL Install Package"
tar xf ${Mysql_Package} -C ${softwaredir} || Error "Fail to unzip the Package"
else
LogMsg "No need to unzip"
fi
fi
} InstallMysql(){
reallinkname=${basedir}
Mysql_File=`find ${softwaredir} -name ${version}*.tar.gz -exec basename {} .tar.gz \;`
if [[ ! -d ${Mysql_File} ]];then
LogMsg "It is unziping mysql install Package ..."
UnzipPackages
LogMsg "unzip successful"
fi
cd ${softwaredir}
if [[ ! -d ${basedir} ]];then
ln -s ${Mysql_File} ${reallinkname}
chown -R ${mysqluser}:${mysqluser} ${reallinkname}
fi
cd ${reallinkname}
result=$(echo ${version}|grep mariadb)
if [[ "$result" != "" ]];then
LogMsg "Install $version..."
./scripts/mysql_install_db --defaults-file=${defaults_file} >>/dev/null || Error "Fail to init MySQL"
else
LogMsg "Install $version..."
bin/mysqld --defaults-file=${defaults_file} --user=mysql --initialize-insecure --datadir=${datadir} --basedir=${basedir} >>/dev/null || Error "Fail to init MySQL"
bin/mysql_ssl_rsa_setup --datadir=${datadir}>>/dev/null
sleep 2
fi
} MakeScript(){
if [[ ! -f /usr/local/mysql3306 ]];then
Error "start script file mysql3306 not found"
else
chmod u+x /usr/local/mysql3306
cp ${softwaredir}/mysql3306 ${mysqldautostartfile}
sed -i "0,/^basedir=/s@basedir=@basedir=${basedir}@" ${mysqldautostartfile}
sed -i "0,/^datadir=/s@datadir=@datadir=${databasedir}@" ${mysqldautostartfile}
fi
} #start script
StartMySQL(){
service mysql${port} start || Error "MySQL start Failed"
} # change mysql password
ChangePassword(){
mysql -S /data/${port}/mysql.sock -e "set password for root@localhost = password('123456');" || Error "Change root password Failed"
mysql -S /data/${port}/mysql.sock -uroot -p123456 -e "grant all privileges on *.* to root@'%' identified by '123456' with grant option;"
} TaskMain(){
LogMsg "It is checking whether the mysqluser ready or not ..."
CheckUser
LogMsg "The mysqluser is ready" LogMsg "It is initiazating directories ..."
InitDirs
LogMsg "The directories initiazating successful" LogMsg "It is initiazating environment variables ..."
InitEnv
LogMsg "The environment variables initiazating successful" LogMsg "It is setting default files ..."
SetMycnf
LogMsg "The default files set successful" LogMsg "It is installing mysql database ..."
InstallMysql
LogMsg "the mysql database install successful" LogMsg "It is making mysql start script ..."
MakeScript
LogMsg "make script successful" LogMsg "It is starting mysql ..."
StartMySQL
LogMsg "successful" LogMsg "It is changing mysql password ..."
ChangePassword
LogMsg "change successful" LogMsg "The mysql service set successful"
} # The execution body of the script
LogMsg "============Start Install MySQL============"
TaskMain $@;rc=$?
if [ ${rc} -ne 0 ] ;then
Error '[ERROR] Failed to install mysql.'
else
LogMsg '[INFO] Completed install mysql.'
fi
LogMsg "The script execution ends."
exit ${rc}
启动脚本:
#!/bin/sh
# Copyright Abandoned TCX DataKonsult AB & Monty Program KB & Detron HB
# This file is public domain and comes with NO WARRANTY of any kind # MySQL daemon start/stop script. # Usually this is put in /etc/init.d (at least on machines SYSV R4 based
# systems) and linked to /etc/rc3.d/S99mysql and /etc/rc0.d/K01mysql.
# When this is done the mysql server will be started when the machine is
# started and shut down when the systems goes down. # Comments to support chkconfig on RedHat Linux
# chkconfig:
# description: A very fast and reliable SQL database engine. # Comments to support LSB init script conventions
### BEGIN INIT INFO
# Provides: mysql
# Required-Start: $local_fs $network $remote_fs
# Should-Start: ypbind nscd ldap ntpd xntpd
# Required-Stop: $local_fs $network $remote_fs
# Default-Start:
# Default-Stop:
# Short-Description: start and stop MySQL
# Description: MySQL is a very fast and reliable SQL database engine.
### END INIT INFO # If you install MySQL on some other places than /usr/local/mysql, then you
# have to do one of the following things for this script to work:
#
# - Run this script from within the MySQL installation directory
# - Create a /etc/my.cnf file with the following information:
# [mysqld]
# basedir=/usr/local/mysql<path-to-mysql-installation-directory>
# - Add the above to any other configuration file (for example ~/.my.ini)
# and copy my_print_defaults to /usr/bin
# - Add the path to the mysql-installation-directory to the basedir variable
# below.
#
# If you want to affect other MySQL variables, you should make your changes
# in the /etc/my.cnf, ~/.my.cnf or other MySQL configuration files. # If you change base dir, you must also change datadir. These may get
# overwritten by settings in the MySQL configuration files. basedir=
datadir= # Default value, in seconds, afterwhich the script should timeout waiting
# for server start.
# Value here is overriden by value in my.cnf.
# means don't wait at all
# Negative numbers mean to wait indefinitely
service_startup_timeout= # Lock directory for RedHat / SuSE.
lockdir='/var/lock/subsys'
lock_file_path="$lockdir/mysql" # The following variables are only set for letting mysql.server find things. # Set some defaults
mysqld_pid_file_path=
if test -z "$basedir"
then
basedir=/usr/local/mysql
bindir=/usr/local/mysql/bin
if test -z "$datadir"
then
datadir=/usr/local/mysql/data
fi
sbindir=/usr/local/mysql/bin
libexecdir=/usr/local/mysql/bin
else
bindir="$basedir/bin"
if test -z "$datadir"
then
datadir="$basedir/data"
fi
sbindir="$basedir/sbin"
libexecdir="$basedir/libexec"
fi # datadir_set is used to determine if datadir was set (and so should be
# *not* set inside of the --basedir= handler.)
datadir_set= #
# Use LSB init script functions for printing messages, if possible
#
lsb_functions="/lib/lsb/init-functions"
if test -f $lsb_functions ; then
. $lsb_functions
else
log_success_msg()
{
echo " SUCCESS! $@"
}
log_failure_msg()
{
echo " ERROR! $@"
}
fi PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin"
export PATH mode=$ # start or stop [ $# -ge ] && shift other_args="$*" # uncommon, but needed when called from an RPM upgrade action
# Expected: "--skip-networking --skip-grant-tables"
# They are not checked here, intentionally, as it is the resposibility
# of the "spec" file author to give correct arguments only. case `echo "testing\c"`,`echo -n testing` in
*c*,-n*) echo_n= echo_c= ;;
*c*,*) echo_n=-n echo_c= ;;
*) echo_n= echo_c='\c' ;;
esac parse_server_arguments() {
for arg do
case "$arg" in
--basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'`
bindir="$basedir/bin"
if test -z "$datadir_set"; then
datadir="$basedir/data"
fi
sbindir="$basedir/sbin"
libexecdir="$basedir/libexec"
;;
--datadir=*) datadir=`echo "$arg" | sed -e 's/^[^=]*=//'`
datadir_set=
;;
--pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
--service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
esac
done
} wait_for_pid () {
verb="$1" # created | removed
pid="$2" # process ID of the program operating on the pid-file
pid_file_path="$3" # path to the PID file. i=
avoid_race_condition="by checking again" while test $i -ne $service_startup_timeout ; do case "$verb" in
'created')
# wait for a PID-file to pop into existence.
test -s "$pid_file_path" && i='' && break
;;
'removed')
# wait for this PID-file to disappear
test ! -s "$pid_file_path" && i='' && break
;;
*)
echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path"
exit
;;
esac # if server isn't running, then pid-file will never be updated
if test -n "$pid"; then
if kill - "$pid" >/dev/null; then
: # the server still runs
else
# The server may have exited between the last pid-file check and now.
if test -n "$avoid_race_condition"; then
avoid_race_condition=""
continue # Check again.
fi # there's nothing that will affect the file.
log_failure_msg "The server quit without updating PID file ($pid_file_path)."
return # not waiting any more.
fi
fi echo $echo_n ".$echo_c"
i=`expr $i + `
sleep done if test -z "$i" ; then
log_success_msg
return
else
log_failure_msg
return
fi
} # Get arguments from the my.cnf file,
# the only group, which is read from now on is [mysqld]
if test -x "$bindir/my_print_defaults"; then
print_defaults="$bindir/my_print_defaults"
else
# Try to find basedir in /etc/my.cnf
conf=/etc/my.cnf
print_defaults=
if test -r $conf
then
subpat='^[^=]*basedir[^=]*=\(.*\)$'
dirs=`sed -e "/$subpat/!d" -e 's//\1/' $conf`
for d in $dirs
do
d=`echo $d | sed -e 's/[ ]//g'`
if test -x "$d/bin/my_print_defaults"
then
print_defaults="$d/bin/my_print_defaults"
break
fi
done
fi # Hope it's in the PATH ... but I doubt it
test -z "$print_defaults" && print_defaults="my_print_defaults"
fi #
# Read defaults file from 'basedir'. If there is no defaults file there
# check if it's in the old (depricated) place (datadir) and read it from there
# extra_args=""
if test -r "$basedir/my.cnf"
then
extra_args="-e $basedir/my.cnf"
fi parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server` #
# Set pid file if not given
#
if test -z "$mysqld_pid_file_path"
then
mysqld_pid_file_path=$datadir/`hostname`.pid
else
case "$mysqld_pid_file_path" in
/* ) ;;
* ) mysqld_pid_file_path="$datadir/$mysqld_pid_file_path" ;;
esac
fi case "$mode" in
'start')
# Start daemon # Safeguard (relative paths, core dumps..)
cd $basedir echo $echo_n "Starting MySQL"
if test -x $bindir/mysqld_safe
then
# Give extra arguments to mysqld with the my.cnf file. This script
# may be overwritten at next upgrade.
$bindir/mysqld_safe --defaults-file="$datadir/my.cnf" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &
wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$? # Make lock for RedHat / SuSE
if test -w "$lockdir"
then
touch "$lock_file_path"
fi exit $return_value
else
log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)"
fi
;; 'stop')
# Stop daemon. We use a signal here to avoid having to know the
# root password. if test -s "$mysqld_pid_file_path"
then
# signal mysqld_safe that it needs to stop
touch "$mysqld_pid_file_path.shutdown" mysqld_pid=`cat "$mysqld_pid_file_path"` if (kill -0 $mysqld_pid 2>/dev/null)
then
echo $echo_n "Shutting down MySQL"
kill $mysqld_pid
# mysqld should remove the pid file when it exits, so wait for it.
wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$?
else
log_failure_msg "MySQL server process #$mysqld_pid is not running!"
rm "$mysqld_pid_file_path"
fi # Delete lock for RedHat / SuSE
if test -f "$lock_file_path"
then
rm -f "$lock_file_path"
fi
exit $return_value
else
log_failure_msg "MySQL server PID file could not be found!"
fi
;; 'restart')
# Stop the service and regardless of whether it was
# running or not, start it again.
if $0 stop $other_args; then
$0 start $other_args
else
log_failure_msg "Failed to stop running server, so refusing to try to start."
exit 1
fi
;; 'reload'|'force-reload')
if test -s "$mysqld_pid_file_path" ; then
read mysqld_pid < "$mysqld_pid_file_path"
kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL"
touch "$mysqld_pid_file_path"
else
log_failure_msg "MySQL PID file could not be found!"
exit 1
fi
;;
'status')
# First, check to see if pid file exists
if test -s "$mysqld_pid_file_path" ; then
read mysqld_pid < "$mysqld_pid_file_path"
if kill -0 $mysqld_pid 2>/dev/null ; then
log_success_msg "MySQL running ($mysqld_pid)"
exit 0
else
log_failure_msg "MySQL is not running, but PID file exists"
exit 1
fi
else
# Try to find appropriate mysqld process
mysqld_pid=`pidof $libexecdir/mysqld` # test if multiple pids exist
pid_count=`echo $mysqld_pid | wc -w`
if test $pid_count -gt 1 ; then
log_failure_msg "Multiple MySQL running but PID file could not be found ($mysqld_pid)"
exit 5
elif test -z $mysqld_pid ; then
if test -f "$lock_file_path" ; then
log_failure_msg "MySQL is not running, but lock file ($lock_file_path) exists"
exit 2
fi
log_failure_msg "MySQL is not running"
exit 3
else
log_failure_msg "MySQL is running but PID file could not be found"
exit 4
fi
fi
;;
*)
# usage
basename=`basename "$0"`
echo "Usage: $basename {start|stop|restart|reload|force-reload|status} [ MySQL server options ]"
exit 1
;;
esac exit 0
配置文件:
[client]
port =
socket = /data//mysql.sock [mysqld]
port =
socket = /data//mysql.sock
user = mysql
server_id =
character-set-server = utf8
default-storage-engine = innodb
pid-file = /data//mysql.pid
datadir = /data//data
basedir = /usr/local/mysql
lower_case_table_names =
interactive_timeout =
local_infile =
max-connections =
back_log =
max_connect_errors =
open_files_limit =
table_definition_cache =
innodb_buffer_pool_size = 1G
log_bin = /data//data/mysql-bin
slow_query_log_file = /data//log/slowlog.log
log_error = /data//log/mysql-error.log
relay_log = /data//log/mysql-relay
innodb_autoextend_increment =
innodb_file_per_table =
innodb_open_files =
innodb-log-files-in-group =
innodb_log_file_size = 200M
innodb_rollback_on_timeout =
innodb_lock_wait_timeout =
innodb_sort_buffer_size = 4M
innodb_log_buffer_size = 32M
innodb_read_io_threads =
innodb_write_io_threads =
join_buffer_size =
tmp_table_size = 64M
max_heap_table_size = 64M
read_buffer_size =
read_rnd_buffer_size =
binlog_format = row
binlog_cache_size =
long_query_time =
slow_query_log =
master_verify_checksum =
slave_sql_verify_checksum =
relay_log_recovery =
relay_log_purge =
sync_binlog =
expire_logs_days =
mysql自动化安装脚本(二进制安装)的更多相关文章
- 编译安装和二进制安装mysql
二进制安装mysql-5.6.46 mysql二进制安装,已经编译成二进制了,只需要做一些配置即可 [root@localhost ~]$ yum install autoconf libaio -y ...
- CentOS6.9安装MySQL(编译安装、二进制安装)
目录 CentOS6.9安装MySQL Linux安装MySQL的4种方式: 1. 二进制方式 特点:不需要安装,解压即可使用,不能定制功能 2. 编译安装 特点:可定制,安装慢 5.5之前: ./c ...
- centos7:mysql-5.7.23安装(二进制安装)
mysql有二进制码安装,和源码编译安装(mysql5.5使用cmake安装,mysql5.7需要安装boost依赖安装),因为boost依赖安装麻烦,所以用二进制码安装 MySql 5.7.23安装 ...
- rpm安装和二进制安装
rpm包安装 Tomcat RPM安装(先安装JDK + 再安装Tomcat) 1:升级系统自带的JDK(也可以使用oracle的JDK) yum install -y java-1.8.0-open ...
- shell 脚本二进制安装mysql
以下脚本的手动安装连接:https://www.cnblogs.com/leihongnu/p/12581793.html [ #/bin/bash#脚本安装 mysql,上传安装包至 /rootcd ...
- MySQL 5.6.19 二进制安装
1. 操作系统 CentOS release 6.2 (Final) 2. 创建用户和组 [root@mymaster1 ~]# groupadd mysql [root@ ...
- 自动化(脚本)安装httpd服务
思路: 1.检查传递的参数,httpd源码文件 2.检查执行脚本的用户是否为root 3.检查rpm是否安装过httpd,若安装过,则卸载 4.安装编译所需的工具 5.从网上下载httpd源码 6.配 ...
- Linux mysql 5.5.10 二进制安装过程记录和 修改 密码 登录
1.useradd clouder2.解压缩mysql.tar.bz2到/home/clouder2.mv /etc/my.cnf /etc/my.cnf.bak3./home/clouder/mys ...
- centos 安装mindoc 二进制安装
自建 文档管理系统或者说 wiki系统 mindoc官网: https://www.iminho.me/#%E6%BC%94%E7%A4%BA mindoc github页面:https://gith ...
随机推荐
- IDEA多模块父子依赖maven项目war包部署
IDEA多模块父子依赖maven项目war包部署 Posted on 2018-04-25 | In IDEA | | Visitors 286 IDEA全称为IntrlliJ IDEA,它是一款非常 ...
- 如何通过submit提交form表单获取后台传来的返回值
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_34651764/article/details/76373846 小伙伴是不是遇到过这样的问题 ...
- 网站多语言转换.利用Google 语言的js.贴到网站就能用.
<div id="google_translate_element"></div><script>function googleTranslat ...
- 【22.70%】【codeforces 591C】 Median Smoothing
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 修改MessageBox的标题的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 1.用Win API的::MessageBox或CWnd::MessageBox代替AfxMessageBox. 2. ...
- hx计算机基础
参考:http://python.jobbole.com/82294/ https://www.jianshu.com/p/aed6067eeac9 1. 操作系统基础题 1)在32位操作系统下,系统 ...
- QT之圆形头像(使用PNG的Mask达到的效果)
废话不多说!直接上代码. 我们在很多UI设计应用中,需要用到自定义形状头像,在这里,我对圆形头像的设计做简单的阐述,其它形状头像可参考本文做相应的更改即可.如下图所示为设计的圆形头像: 上代码: Se ...
- WolframAlpha 的使用
WolframAlpha 1. 求解复杂方程组 a+b=−4ab+c=2ac=1 直接点开网站,在输入框中输入,a+b=-4;ab+c=2;ac=1;(逗号分割开来),
- 用 Expression Blend 创建酷炫的 Button
原文:用 Expression Blend 创建酷炫的 Button 原文:Creating "Cool" Buttons with Expression Blend Author ...
- 机器学习:DeepDreaming with TensorFlow (三)
我们看到,利用TensorFlow 和训练好的Googlenet 可以生成多尺度的pattern,那些pattern看起来比起单一通道的pattern你要更好,但是有一个问题就是多尺度的pattern ...