zoukankan      html  css  js  c++  java
  • MySQL单机单实例安装脚本

    说明:使用mysql generic tar.gz包快速安装mysql

    三个文件installation_of_single_mysql.sh、template_install-my.cnf、mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz

    修改脚本的配置信息指定template_install-my.cnf和mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz位置

    默认root账号是iforogt

    • installation_of_single_mysql.sh
    #!/bin/bash
    # line:           V1.8
    # mail:           gczheng@139.com
    # data:           2018-09-04
    # script_name:    installation_of_single_mysql.sh
    # function:       Install mysql5.7.18
    
    #=======================================================================
    #配置信息
    #=======================================================================
    MYSQL_DATADIR=/data/mysqldata
    MYCNF=template_install-my.cnf
    MYSQL_SOURCE_PACKAGES=/software/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
    MYSQL_SOURCE_PACKAGES_NAMES=`echo $MYSQL_SOURCE_PACKAGES |awk -F '/' '{print $NF}' |awk -F ".tar.gz" '{printf $1}'`
    MYSQL_DOWNLOAD_LINK='http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz'
    MYSQL=/usr/local/mysql/bin/mysql
    
    #=======================================================================
    # echo添加颜色
    #=======================================================================
    echo_color(){
        color=${1} && shift
        case ${color} in
            black)
                echo -e "e[0;30m${@}e[0m"
                ;;
            red)
                echo -e "e[0;31m${@}e[0m"
                ;;
            green)
                echo -e "e[0;32m${@}e[0m"
                ;;
            yellow)
                echo -e "e[0;33m${@}e[0m"
                ;;
            blue)
                echo -e "e[0;34m${@}e[0m"
                ;;
            purple)
                echo -e "e[0;35m${@}e[0m"
                ;;
            cyan)
                echo -e "e[0;36m${@}e[0m"
                ;;
            *)
                echo -e "e[0;37m${@}e[0m"
                ;;
        esac    # --- end of case ---
    }
    
    #=======================================================================
    #检查安装包、脚本、my.cnf是否齐全
    #=======================================================================
    
    function chk_install_resource()
    {
    	#判断 template_install-my.cnf 是否存在
    	if [ ! -f "$MYCNF" ];then
    		echo_color red "$(date +'%Y-%m-%d %H:%M:%S') $MYCNF file is not exits!$(echo_warning)"
    		exit 1
    	fi
    	#判断 MySQL Community Server 5.7.18 tar包是否存在
    	if [ ! -f "$MYSQL_SOURCE_PACKAGES" ];then
    		echo_color red "$(date +'%Y-%m-%d %H:%M:%S') $MYSQL_SOURCE_PACKAGES is not exits, please download it from $MYSQL_DOWNLOAD_LINK"
    		exit 1
    	fi
    }
    #=======================================================================
    # 添加帐号和目录
    #=======================================================================
    function create_sys_user()
    {
    	#添加mysql用户信息
    	if id mysql &> /dev/null;then
    		echo_color red "$(date +'%Y-%m-%d %H:%M:%S') MySQL user is exits."
    	else
    		useradd -r -s /bin/false mysql && echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') The system user is added to success .."
    	fi
    
    	if [ ! -d "${MYSQL_DATADIR}" ];then
    		mkdir -p ${MYSQL_DATADIR} && echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') MySQL data directory is created .."
    		chown -R mysql:mysql ${MYSQL_DATADIR}
    		chmod 750 ${MYSQL_DATADIR}
    	elif [ "$(ls -A ${MYSQL_DATADIR})" = "" ];then
    		echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') MySQL data directory is exits."
    	else
    		echo_color red "$(date +'%Y-%m-%d %H:%M:%S') MySQL data directory is not empty. Please check it."
    		exit 1
    	fi
    }
    #=======================================================================
    #检查是否有旧的mysql/mariadb版本存在
    #=======================================================================
    
    function chk_old_mysql_version()
    {
    	mysqlNum=$(rpm -qa | grep -Ei 'mysql|mariadb'|wc -l)
    	if [ "${mysqlNum}" -gt "0" ];then
    		echo_color red "$(date +'%Y-%m-%d %H:%M:%S') The system has MySQL other version. There may be a conflict in the version!If it continues, the original database will be uninstall."
    		read -p "Do you continue to install it(y/n):" cn
    		case $cn in
    			y|Y)
    				rpm -qa | grep -Ei 'mysql|mariadb' | xargs yum remove -y &> /dev/null
    				source /etc/profile
    				tar_install
    				;;
    			n|N)
    				exit 1
    				;;
    			*)
    				echo_color red "$(date +'%Y-%m-%d %H:%M:%S') Input ERROR."
    		esac
    	else
    		echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') No old version was found."
    		source /etc/profile
    		tar_install
    	fi
    }
    
    #=======================================================================
    # 解压安装
    #=======================================================================
    function installPackage()
    {
    count=0
    package=(gcc gcc-c++ bzip2 bzip2-devel bzip2-libs python-devel libaio libaio-devel ncurses ncurses-devel cmake numactl-libs)
    nums01=${#package[@]}
    for((i=0;i<nums01;i++));
    do
            char=${package[$i]}
            rpm -qa | grep "^$char"
            if [ $? != 0 ] ; then
                    error[$count]=${package[$i]}
                    count=$(($count+1))
                    echo_color red "$(date +'%Y-%m-%d %H:%M:%S') The ${package[$i]} is not installed.Please check it.."
    
            fi
    done
    if [ $count -gt "0" ];then
            echo "You have $count patchs are not installed." 
            echo "the not installed patch is:" 
            nums02=${#error[@]}
            for((ii=0;ii<nums02;ii++));
            do
                    echo "${error[$ii]}^" 
            done
            echo -e  "Are you sure to install the patch[yes or no]:c" 
            read select 
            if [ $select == "yes" ]; then
                    for((is=0;is<nums02;is++));
                    do
                            var=${error[$is]}
                            echo $var
                            yum install -y $var
                    done
            fi
    else
            echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Check pass!.."
    fi
    count=0
    rpm -q gcc gcc-c++ bzip2 bzip2-devel bzip2-libs python-devel libaio libaio-devel ncurses ncurses-devel cmake numactl-libs | grep "not installed"
    }
    
    function tar_install()
    {
    	installPackage
    	echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Starting unzip $MYSQL_SOURCE_PACKAGES .."
    	tar zxvf $MYSQL_SOURCE_PACKAGES -C /usr/local/ 
    	echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Unzip $MYSQL_SOURCE_PACKAGES SUCCESS .."
    	if [ ! -d "/usr/local/mysql" ];then
    		ln -s /usr/local/${MYSQL_SOURCE_PACKAGES_NAMES}  /usr/local/mysql
    		chown -R mysql:mysql /usr/local/mysql
    		chown -R mysql:mysql /usr/local/${MYSQL_SOURCE_PACKAGES_NAMES}
    		chmod 750 /usr/local/mysql
    		chmod 750 /usr/local/${MYSQL_SOURCE_PACKAGES_NAMES}
    		echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') MySQL package has been placed in the right position .."
    		cp -f $MYCNF /etc/my.cnf
    	else
    		read -p "/usr/local/mysql install directory already exists, delete it, and continue(y/n):" dn
    		case $dn in
    			y|Y)
    				rm -rf /usr/local/mysql
    				ln -s /usr/local/${MYSQL_SOURCE_PACKAGES_NAMES}  /usr/local/mysql
    				chown -R mysql:mysql /usr/local/mysql
    				chown -R mysql:mysql /usr/local/${MYSQL_SOURCE_PACKAGES_NAMES}
    				chmod 750 /usr/local/mysql
    				chmod 750 /usr/local/${MYSQL_SOURCE_PACKAGES_NAMES}
    				echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') MySQL package has been placed in the right position .."
    				cp -f $MYCNF /etc/my.cnf
    				;;
    			n|N)
    				exit 1
    				;;
    			*)
    			echo_color red "$(date +'%Y-%m-%d %H:%M:%S') /usr/local/mysql is exits.Please check it."
    		esac
    	fi
    
    	echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Starting initialization .."
    	/usr/local/mysql/bin/mysqld --initialize --user=mysql  &> /dev/null && echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Initialization ......SUCCESS"
    }
    
    #=======================================================================
    # 修改环境变量
    #=======================================================================
    function add_system_profile()
    {
    cat >> /etc/profile <<EOF
    export PATH=$PATH:/usr/local/mysql/bin/
    EOF
    source /etc/profile
    }
    
    
    function add_mysql_ldconfig()
    {
    cat > /etc/ld.so.conf.d/mysql.conf <<EOF
    /usr/local/mysql/lib
    EOF
    ldconfig
    }
    
    function add_libmysqlclient()
    {
    if [ -f /etc/ld.so.conf.d/mysql.conf ];then
    	LDNUMS=`grep -i "/usr/local/mysql/lib" /etc/ld.so.conf.d/mysql.conf |wc -l`
    	if [ $LDNUMS -eq 0 ];then
    		echo_color red "$(date +'%Y-%m-%d %H:%M:%S') The configuration file is empty!"
    		add_mysql_ldconfig
    		echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Flush ldconfig done .."
    	else
    		LDEXISTS=`grep -i  "/usr/local/mysql/lib" /etc/ld.so.conf.d/mysql.conf |grep -e "^#" |wc -l`
    		if [ $LDEXISTS -gt 0 ];then
    			add_mysql_ldconfig
    			echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Has been configured!"
    		fi
    	fi
    else
    	echo_color red "$(date +'%Y-%m-%d %H:%M:%S') /etc/ld.so.conf.d/mysql.conf is not exits!"
    	add_mysql_ldconfig
    	echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Flush ldconfig done .."
    fi
    }
    
    
    function modify_system_env()
    {
    #egrep "/usr/local/mysql/bin/" /etc/profile  &> /dev/null
    PROFILES=`grep -i  "/usr/local/mysql/bin/" /etc/profile |wc -l`
    if [ $PROFILES -eq 0 ];then
    	add_system_profile
    	echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Flush profile done .."
    else
    	EXISTS=`grep -i  "/usr/local/mysql/bin/" /etc/profile |grep -e "^#" |wc -l`
    	if [ $EXISTS -gt 0 ];then
    		add_system_profile
    		echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Flush profile done .."
    	fi
    fi
    }
    
    #=======================================================================
    #创建MySQL服务
    #=======================================================================
    
    function el7_create_mysql_service()
    {
    	cat > /usr/lib/systemd/system/mysql.service <<EOF
    [Unit]
    Description=mysql
    After=syslog.target network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=forking
    ExecStart=/usr/local/mysql/support-files/mysql.server start
    ExecReload=/usr/local/mysql/support-files/mysql.server restart
    ExecStop=/usr/local/mysql/support-files/mysql.server stop
    LimitNOFILE = 65535
    PrivateTmp=false
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    	systemctl daemon-reload && echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Reload systemd services .."
    	systemctl enable mysql.service && echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Enable MySQL systemd service .."
    	systemctl start mysql.service && echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Starting MySQL......SUCCESS!" || echo_color red "$(date +'%Y-%m-%d %H:%M:%S') Starting MySQL......FAILED!."
    }
    
    function el6_create_mysql_service()
    {
    	cd /usr/local/mysql/support-files/
    	cp mysql.server /etc/init.d/mysql  
    	chmod +x /etc/init.d/mysql
    	chkconfig --add mysql   && echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Add MySQL service for management .."
    	chkconfig --list mysql  && echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') List MySQL service .."
    	/etc/init.d/mysql start && echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Starting MySQL......SUCCESS!" || echo_color red "$(date +'%Y-%m-%d %H:%M:%S') Starting MySQL......FAILED!."
    }
    
    #=======================================================================
    # 添加帐号
    #=======================================================================
    
    function modify_mysql_account()
    {
    	password=`awk '/A temporary password/ {print $NF}' ${MYSQL_DATADIR}/error.log`
    	#echo_color cyan "mysql temp password is ${password}"
    	if [ "${password}" != "" ];then
    	${MYSQL} -uroot -p"${password}"  --connect-expired-password  -e "alter user root@localhost identified by 'iforgot';flush privileges;" &> /dev/null && echo_color cyan  "$(date +'%Y-%m-%d %H:%M:%S') 系统随机密码修改成功."
    	p1=$?
    	else
    		echo_color red  "$(date +'%Y-%m-%d %H:%M:%S') MySQL密码获取失败,请排查/清除数据目录重新安装."
    		exit 1
    	fi
    	${MYSQL} -uroot -piforgot -e "grant all privileges on *.* to root@'%' identified by 'iforgot';" &> /dev/null && echo_color cyan  "$(date +'%Y-%m-%d %H:%M:%S') 授予root用户通过任意主机操作所有数据库的所有权限成功."
    	p2=$?
    	${MYSQL} -uroot -piforgot -e "grant RELOAD,REPLICATION SLAVE, REPLICATION CLIENT on *.* to repl@'%' identified by 'repl';" &> /dev/null && echo_color cyan  "$(date +'%Y-%m-%d %H:%M:%S') 授予repl用户通过任意主机对所有数据库进行主从复制的权限成功."
    	p3=$?
    	${MYSQL} -uroot -piforgot -e "grant SELECT, PROCESS, REPLICATION CLIENT, SHOW DATABASES on *.* to monitor@'%' identified by 'monitor';" &> /dev/null && echo_color cyan  "$(date +'%Y-%m-%d %H:%M:%S') 授予monitor用户通过任意主机对所有数据库的读取权限成功."
    	p4=$?
    	${MYSQL} -uroot -piforgot -e "grant SELECT,RELOAD,LOCK TABLES,REPLICATION CLIENT,PROCESS,SUPER,CREATE,SHOW DATABASES,SHOW VIEW, EVENT, TRIGGER, create tablespace on *.* to dbbackup@'localhost' identified by  'dbbackup';" &> /dev/null && echo_color cyan  "$(date +'%Y-%m-%d %H:%M:%S') 授予dbbackup用户通过localhost主机对所有数据库进行备份的权限成功."
    	p5=$?
    	${MYSQL} -uroot -piforgot -e "grant insert,update,delete,select,create,drop,index,trigger,alter on *.* to producer@'%'  identified by 'iforgot';" &> /dev/null && echo_color cyan  "$(date +'%Y-%m-%d %H:%M:%S') 授予producer用户通过任意主机对所有数据库进行常规操作的权限成功."
    	p6=$?
    	${MYSQL} -uroot -piforgot -e "grant insert,update,delete,select,create,drop,index,trigger,alter on *.* to producer@'localhost' identified by 'iforgot';" &> /dev/null && echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') 授予producer用户通过localhost主机对所有数据库进行常规操作的权限成功."
    	p7=$?
    	${MYSQL} -uroot -piforgot -e "flush privileges" &> /dev/null && echo_color cyan  "$(date +'%Y-%m-%d %H:%M:%S') 权限刷新成功."
    	p8=$?
    	if [[ "${p1}" == "0" && "${p2}" == "0" && "${p3}" == "0" && "${p4}" == "0" && "${p5}" == "0" && "${p6}" == "0" && "${p7}" == "0" && "${p8}" == "0" ]];then
    		echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') 现在可以登录mysql数据库,root和producer用户的默认密码是33[41;37m iforgot33[0m."
    		${MYSQL} -uroot -piforgot -e "select user,host,authentication_string from mysql.user;"
    	else
    		echo_color red "$(date +'%Y-%m-%d %H:%M:%S') 授权失败,请手动执行授权操作."
    	fi
    }
    
    #=======================================================================
    # 开始安装mysql
    #=======================================================================
    function mysql_install()
    {
    	version=$(uname -r |awk -F '.' '{ print $(NF-1) }')
    	if [ "${version}" != "el7" ];then
    		echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Start install mysql for el6."
    		chk_install_resource
    		create_sys_user
    		chk_old_mysql_version
    		modify_system_env
    		add_libmysqlclient
    		el6_create_mysql_service
    		sleep 5
    		modify_mysql_account
    	else 
    		echo_color cyan "$(date +'%Y-%m-%d %H:%M:%S') Start install mysql for el7."
    		chk_install_resource
    		create_sys_user
    		chk_old_mysql_version
    		modify_system_env
    		add_libmysqlclient
    		el7_create_mysql_service
    		sleep 5
    		modify_mysql_account
    	fi
    }
    
    mysql_install
    echo_color blue "$(date +'%Y-%m-%d %H:%M:%S') 33[42;37m installation_of_single_mysql.sh执行完成 33[0m"
    
    
    • template_install-my.cnf
    # line          :V1.8
    # mail          :gczheng@139.com
    # data          :2018-07-19
    # file_name     :my.cnf
    # update        :调整innodb_open_files设置值,必须小于open_files_limit的设置值
    
    #### 注意     :建议参数根据实际情况作调整
    #### 本配置文件主要适用于MySQL 5.7.18版本
    
    # ********* 以下重要参数必须修改核对 *********
    # 1.innodb_flush_log_at_trx_commit=1
    # 2.sync_binlog = 1
    # 3.innodb_strict_mode = OFF                          #关闭InnoDB严格检查模式
    # 4.innodb_flush_method = O_DIRECT
    # 5.lower_case_table_names = 1                        #设置区分大小写,1表示不区分大小写,0表示区分大小写
    # 6.character-set-server = utf8
    # 7.sql_mode                                          #默认配置
    # 8.server-id =1                                      #修改成对应数值
    # 9.innodb_buffer_pool_size = 10G                     #纯mysql server 配置50%和 混合内存配置不低于10G~40%
    #10.key_buffer_size=1G                                #如果有myisam表请配置为1G,没有请配置64M
    #11.innodb_data_file_path = ibdata1:1G:autoextend     #确认配置是否跟原来一样,之前已配置好请维持原样,如未配置请注释掉,新版本请取消注释
    #12.log_bin = /data/mysqldata/binlog                  #旧版本或者之前已配置好如:log_bin =/r2/data/mysqldata/slave-bin,请维持原样
    #13.slave-parallel                                    #从库开启并行复制,并行复制参数取消注释
    #14.undolog                                           #确认配置是否跟原来一样,之前已配置好请维持原样,如未配置请注释掉,新版本(包括升级版本)请取消注释并创建目录并授权
    # ********************************************
    
    [client]
    port    = 3306
    socket  = /data/mysqldata/mysql.sock
    #=======================================================================
    # # MySQL客户端配置
    #=======================================================================
    [mysql]
    prompt="(u@h) \R:\m:\s [d]> "
    no-auto-rehash
    default-character-set = utf8mb4
    #=======================================================================
    # MySQL服务器全局配置
    #=======================================================================
    [mysqld]
    user = mysql
    port = 3306
    server-id = 1
    tmpdir = /data/mysqldata
    datadir = /data/mysqldata
    socket  = /data/mysqldata/mysql.sock
    wait_timeout = 31536000
    #interactive_timeout = 600
    #sql_mode =                             #sql_mode 配置为空值
    #skip_name_resolve = 1
    lower_case_table_names = 1
    character-set-server = utf8mb4
    log_timestamps = SYSTEM
    init_connect='SET NAMES utf8mb4'
    max_allowed_packet = 128M
    ######################### 性能参数 ####################
    open_files_limit = 10240
    max_connections = 10000
    max_user_connections=9990
    max_connect_errors = 100000
    table_open_cache = 1024
    thread_cache_size = 64
    max_heap_table_size = 32M
    query_cache_type = 0
    ###global cache ###
    key_buffer_size = 1G
    query_cache_size = 0
    tmp_table_size = 32M        #内存临时表
    binlog_cache_size = 4M      #二进制日志缓冲
    ###session cache ###
    sort_buffer_size = 8M       #排序缓冲
    join_buffer_size = 4M       #表连接缓冲
    read_buffer_size = 8M       #顺序读缓冲
    read_rnd_buffer_size = 8M   #随机读缓冲
    thread_stack = 256KB        #线程的堆栈的大小
    ######################### binlog设置 #####################
    binlog_format = ROW
    log_bin = /data/mysqldata/binlog
    max_binlog_size = 1G
    expire_logs_days = 15       #binlog比较占空间,注意磁盘空间
    sync_binlog = 1                  #重要参数必须修改为1
    ######################### 复制设置 ########################
    log_slave_updates = 1
    #replicate-do-db = test
    #binlog-ignore-db = mysql
    ### GTID 配置 ###
    gtid_mode=ON
    enforce-gtid-consistency=true
    #****************** 开启并行复制(从库)******************
    slave-parallel-type=LOGICAL_CLOCK     #基于组提交的并行复制方式
    slave-parallel-workers= 8             #并行的SQL线程数量
    master-info_repository=TABLE          #master信息以表的形式保存
    relay_log_info_repository=TABLE       #slave信息以表的形式保存
    relay_log_recovery=ON                 #relay_log自我修复
    ######################### innodb ##########################
    default_storage_engine = InnoDB
    innodb_data_file_path = ibdata1:1G:autoextend
    innodb_buffer_pool_size = 12G         #系统内存50%
    innodb_open_files = 5120
    innodb_flush_log_at_trx_commit = 1    #线上服务器必须配置为1
    innodb_file_per_table = 1
    innodb_lock_wait_timeout = 5
    innodb_io_capacity = 400              #根据您的服务器IOPS能力适当调整innodb_io_capacity,配SSD盘可调整到 10000 - 20000
    innodb_io_capacity_max = 20000
    innodb_flush_method = O_DIRECT
    innodb_log_file_size = 2G
    innodb_log_files_in_group = 2
    innodb_large_prefix = 0
    innodb_thread_concurrency = 64
    innodb_strict_mode = OFF
    innodb_sort_buffer_size = 4194304
    #****************** undolog设置 ******************
    #innodb_undo_directory = /data/mysqldata/undolog       #undolog日志目录
    #innodb_undo_tablespaces = 2                      #undolog日志文件个数,mysql8之后将弃用
    #innodb_undo_logs = 128                           #回滚段的数量, 至少大于等于35,默认128。
    #innodb_max_undo_log_size = 1G                    #当超过这个阀值(默认是1G),会触发truncate回收(收缩)动作,truncate后空间缩小到10M。
    #innodb_purge_rseg_truncate_frequency = 128       #控制回收(收缩)undolog的频率
    #innodb_undo_log_truncate = 1                     #即开启在线回收undolog日志文件
    ######################### log 设置 #####################
    log_error = /data/mysqldata/error.log
    slow_query_log = 1
    long_query_time = 10
    slow_query_log_file = /data/mysqldata/slow.log
    #=======================================================================
    # MySQL mysqldump配置
    #=======================================================================
    [mysqldump]
    quick
    max_allowed_packet = 128M
    #=======================================================================
    # MySQL mysqld_safe配置
    #=======================================================================
    [mysqld_safe]
    log_error = /data/mysqldata/error.log
    pid_file = /data/mysqldata/mysqldb.pid
    
    
  • 相关阅读:
    python用于web题里写解密脚本
    改变checkbox和radio的默认样式
    div内元素垂直居中
    icheck.js插件
    glyphicons字形图标
    没有内容的span元素下掉问题
    临界区保护
    信号量的使用&生产者消费者问题
    空闲线程和钩子函数
    线程的时间片轮询调度
  • 原文地址:https://www.cnblogs.com/gczheng/p/9674352.html
Copyright © 2011-2022 走看看