install_mysql.sh:安裝腳本 my.cnf: MySQL配置文件 mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz:MySQL二進制包
# ## my.cnf for MySQL 5.7/8.0 ## 注意:個別建議可能須要根據實際狀況做調整,請自行判斷或聯繫我,本人不對這些建議結果負相應責任 ## 本配置文件主要適用於MySQL 5.7/8.0版本 # [client] port = 3306 socket = /var/run/mysql.sock [mysql] prompt="\u@mysqldb \R:\m:\s [\d]> " no-auto-rehash [mysqld] user = mysql port = 3306 basedir = /usr/local/mysql datadir = /usr/local/mysql/data socket = /var/run/mysql.sock pid-file = mysqldb.pid character-set-server = utf8mb4 skip_name_resolve = 1 #若你的MySQL數據庫主要運行在境外,請務必根據實際狀況調整本參數 default_time_zone = "+8:00" open_files_limit = 65535 back_log = 1024 max_connections = 256 max_connect_errors = 1000000 table_open_cache = 60 table_definition_cache = 60 table_open_cache_instances = 64 thread_stack = 512K external-locking = FALSE max_allowed_packet = 32M sort_buffer_size = 4M join_buffer_size = 4M thread_cache_size = 384 interactive_timeout = 600 wait_timeout = 600 tmp_table_size = 32M max_heap_table_size = 32M slow_query_log = 1 log_timestamps = SYSTEM slow_query_log_file = /usr/local/mysql/data/slow.log log-error = /usr/local/mysql/data/error.log long_query_time = 0.1 log_queries_not_using_indexes =1 log_throttle_queries_not_using_indexes = 60 min_examined_row_limit = 100 log_slow_admin_statements = 1 log_slow_slave_statements = 1 server-id = 3306 log-bin = /usr/local/mysql/data/mybinlog sync_binlog = 1 binlog_cache_size = 4M max_binlog_cache_size = 2G max_binlog_size = 1G #注意:MySQL 8.0開始,binlog_expire_logs_seconds選項也存在的話,會忽略expire_logs_days選項 expire_logs_days = 7 master_info_repository = TABLE relay_log_info_repository = TABLE gtid_mode = on enforce_gtid_consistency = 1 log_slave_updates slave-rows-search-algorithms = 'INDEX_SCAN,HASH_SCAN' binlog_format = row binlog_checksum = 1 relay_log_recovery = 1 relay-log-purge = 1 key_buffer_size = 32M read_buffer_size = 8M read_rnd_buffer_size = 4M bulk_insert_buffer_size = 64M myisam_sort_buffer_size = 128M myisam_max_sort_file_size = 10G myisam_repair_threads = 1 lock_wait_timeout = 3600 explicit_defaults_for_timestamp = 1 innodb_thread_concurrency = 0 innodb_sync_spin_loops = 100 innodb_spin_wait_delay = 30 transaction_isolation = REPEATABLE-READ #innodb_additional_mem_pool_size = 16M innodb_buffer_pool_size = 5734M innodb_buffer_pool_instances = 4 innodb_buffer_pool_load_at_startup = 1 innodb_buffer_pool_dump_at_shutdown = 1 innodb_data_file_path = ibdata1:1G:autoextend innodb_flush_log_at_trx_commit = 1 innodb_log_buffer_size = 32M innodb_log_file_size = 2G innodb_log_files_in_group = 2 innodb_max_undo_log_size = 4G innodb_undo_directory = /usr/local/mysql/data/undolog innodb_undo_tablespaces = 95 # 根據您的服務器IOPS能力適當調整 # 通常配普通SSD盤的話,能夠調整到 10000 - 20000 # 配置高端PCIe SSD卡的話,則能夠調整的更高,好比 50000 - 80000 innodb_io_capacity = 4000 innodb_io_capacity_max = 8000 innodb_flush_sync = 0 innodb_flush_neighbors = 0 innodb_write_io_threads = 8 innodb_read_io_threads = 8 innodb_purge_threads = 4 innodb_page_cleaners = 4 innodb_open_files = 65535 innodb_max_dirty_pages_pct = 50 innodb_flush_method = O_DIRECT innodb_lru_scan_depth = 4000 innodb_checksum_algorithm = crc32 innodb_lock_wait_timeout = 10 innodb_rollback_on_timeout = 1 innodb_print_all_deadlocks = 1 innodb_file_per_table = 1 innodb_online_alter_log_max_size = 4G innodb_stats_on_metadata = 0 #注意:MySQL 8.0.16開始刪除該選項 internal_tmp_disk_storage_engine = InnoDB # some var for MySQL 5.7 innodb_checksums = 1 #innodb_file_format = Barracuda #innodb_file_format_max = Barracuda query_cache_size = 0 query_cache_type = 0 innodb_undo_logs = 128 innodb_status_file = 1 #注意: 開啓 innodb_status_output & innodb_status_output_locks 後, 可能會致使log-error文件增加較快 innodb_status_output = 0 innodb_status_output_locks = 0 #performance_schema performance_schema = 1 performance_schema_instrument = '%memory%=on' performance_schema_instrument = '%lock%=on' #innodb monitor innodb_monitor_enable="module_innodb" innodb_monitor_enable="module_server" innodb_monitor_enable="module_dml" innodb_monitor_enable="module_ddl" innodb_monitor_enable="module_trx" innodb_monitor_enable="module_os" innodb_monitor_enable="module_purge" innodb_monitor_enable="module_log" innodb_monitor_enable="module_lock" innodb_monitor_enable="module_buffer" innodb_monitor_enable="module_index" innodb_monitor_enable="module_ibuf_system" innodb_monitor_enable="module_buffer_page" innodb_monitor_enable="module_adaptive_hash" [mysqldump] quick max_allowed_packet = 32M
#!/bin/bash #Date:2019-08-27 #Description:deploy MySQL(5.7+) service #MySQL下載地址:http://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-5.7/
#my.cnf生成地址:http://imysql.cn/my_cnf_generator
. /etc/init.d/functions function Check_Mysql_Service(){ #該函數功能爲檢查當前機器是否已經啓動MySQL程序 echo -e "\033[44;30m開始檢查本機是否存在MySQL程序 \033[0m" mysql_pid=$(pidof mysqld) mysql_port=$(lsof -i:3306) if ([[ ${mysql_pid} != '' ]] || [[ ${mysql_port} != '' ]]);then action "當前本機存在MySQL服務或3306端口被佔用,請確認" /bin/false exit 1
else action "當前本機不存在MySQL服務,檢查經過" /bin/true fi echo -e "\n" } function Mysql_Num_Version_Check(){ #該函數功能爲檢查當前部署的版本是否小於 5.7 主要由於my.cnf文件5.7如下未驗證 echo -e "\033[44;30m開始檢查部署MySQL版本 \033[0m" mysql_num=$(ls -l .|grep mysql-.*.tar.gz|wc -l) if [[ ${mysql_num} != 1 ]];then action "當前目錄下沒有或存在多個MySQL安裝文件,請確保只有一個!!" /bin/false exit 1 fi mysql_version=$(ls .|grep mysql-.*.tar.gz|awk -F- '{print $2}') mysql_version_num=$(ls .|grep mysql-.*.tar.gz|awk -F- '{print $2}'|awk -F. '{print $2}') if [[ ${mysql_version_num} -lt 7 ]];then action "MySQL部署版本不能低於5.7" /bin/false exit 1 fi while true; do read -p "當前部署的,MySQL版本爲:${mysql_version},是否部署(y/n):" deploy_choose if ([[ ${deploy_choose} == "y" ]] || [[ ${deploy_choose} == "Y" ]]);then echo "開始部署" echo -e "\n"
break elif ([[ ${deploy_choose} == "n" ]] || [[ ${deploy_choose} == "N" ]]);then echo "退出部署"
break
else echo -e "\033[41;30m錯誤的選項,請確認後從新輸入!\033[0m"
continue fi done } function Decode_Mysql(){ #該函數功能爲獲取用戶指定的MySQL basedir目錄以及MySQL datadir目錄 export script_path=$(pwd $0) tar_name=$(ls .|grep mysql-.*.tar.gz) tar_dir=${tar_name%.tar.gz*} read -p "開始解壓二進制文件,請確認解壓目錄(默認路徑 /usr/local/):" decode_dir decode_dir=${decode_dir:-/usr/local} if [[ -d ${decode_dir}/${tar_dir} ]];then while true; do read -p "${decode_dir}/${tar_dir}目錄已存在,是否覆蓋(y/n)?" overwrite #檢查解壓目錄下是否已經存在解壓的文件 if ([[ ${overwrite} == "y" ]] || [[ ${overwrite} == "Y" ]]);then echo -e "\n" rm -rf ${decode_dir}/${tar_dir} && rm -f ${decode_dir}/mysql break elif ([[ ${overwrite} == "n" ]] || [[ ${overwrite} == "N" ]]);then echo "退出部署" exit 1
else echo -e "\033[41;30m錯誤的選項,請確認後從新輸入!\033[0m"
continue fi done fi while true; do
if [[ -d ${decode_dir} ]];then export decode_dir=${decode_dir} break elif [[ ${decode_dir} == '' ]];then export decode_dir=/usr/local break
else read -t 10 -p "${decode_dir}目錄不存在,請從新輸入(默認路徑 /usr/local/):" decode_dir [[ $? -ne 0 ]] && echo -e "\033[41;30m選擇超時,使用默認路徑 /usr/local/!\033[0m"
continue fi done echo "正在解壓至${decode_dir}目錄,請稍後..." tar xf ${tar_name} -C ${decode_dir} && cd ${decode_dir} && ln -s ${tar_dir} mysql if [[ $? -eq 0 ]];then action "解壓成功" /bin/true echo -e "\n"
else action "解壓失敗" /bin/false fi } function Mysql_User(){ echo -e "\033[44;30m檢查MySQL用戶\033[0m" id mysql &> /dev/bull if [[ $? -eq 0 ]]; then action "MySQL 用戶已存在,無需建立" /bin/true
else echo "MySQL 用戶不存在,新建MySQL用戶" groupadd -g 8888 mysql && useradd -r -g 8888 -u 8888 -s /bin/false mysql && chown -R mysql.mysql ${decode_dir}/mysql [[ $? -eq 0 ]] && action "新建MySQL用戶:mysql" /bin/true fi id mysql echo -e "\n" } function Create_AND_Modify_Config_File(){ [[ -f /etc/my.cnf ]] && mv /etc/my.cnf /etc/my.cnf-$(date +%F-%H:%H:%S) cd ${script_path} && cp my.cnf /etc/ read -p "開始生成my.cnf文件,請選擇MySQL數據目錄(默認 ${decode_dir}/mysql/data 目錄):" data_dir while true; do
if ([[ ${data_dir} != '' ]] && [[ $(ls -A ${data_dir}) != '' ]]);then #判斷指定的數據目錄是否存在數據 read -p "${data_dir}不爲空,請從新選擇(默認 ${decode_dir}/mysql/data 目錄):" data_dir continue
else
break fi done while true; do
if [[ -d ${data_dir} ]];then export data_dir=${data_dir} break elif [[ ${data_dir} == '' ]];then export data_dir=${decode_dir}/mysql/data break
else read -p "${data_dir}目錄不存在,請從新輸入(默認路徑 ${decode_dir}/mysql/data):" data_dir [[ $? -ne 0 ]] && echo "選擇超時,使用默認路徑"
continue fi done echo -e "\033[44;30m 數據目錄爲:${data_dir}\033[0m" system_mem_size=$(grep "^MemTotal" /proc/meminfo |awk '{print $2}') #獲取當前系統內存大小,設置innodb 緩存大小 innodb_buffer_pool_size="$(echo ${system_mem_size}/1024/10*6|bc)M" sed -i "s#^socket.*#socket = ${data_dir}/mysql.sock#g" /etc/my.cnf sed -i "s#^slow_query_log_file.*#slow_query_log_file = ${data_dir}/slow.log#g" /etc/my.cnf sed -i "s#^log-error.*#log-error = ${data_dir}/error.log#g" /etc/my.cnf sed -i "s#^log-bin.*#log-bin = ${data_dir}/mybinlog#g" /etc/my.cnf sed -i "s#^innodb_buffer_pool_size.*#innodb_buffer_pool_size = ${innodb_buffer_pool_size}M#g" /etc/my.cnf sed -i "s#^innodb_undo_directory.*#innodb_undo_directory = ${data_dir}/undolog#g" /etc/my.cnf sed -i "s#^basedir.*#basedir = ${decode_dir}/mysql#g" /etc/my.cnf sed -i "s#^datadir.*#datadir = ${data_dir}#g" /etc/my.cnf echo -e "\n" } function Init_Mysql(){ echo -e "\033[44;30m開始初始化數據庫\033[0m" cd ${decode_dir}/mysql && bin/mysqld --initialize --user=mysql --basedir=${decode_dir}/mysql --datadir=${data_dir} if [[ $? -eq 0 ]];then action "MySQL初始化完畢" /bin/true mysql_init_pwd=$(grep "temporary password" ${data_dir}/error.log |awk -F "[: ]" '{print $NF}') echo "MySQL初始化密碼爲:${mysql_init_pwd}" chown -R mysql:mysql ${decode_dir}/mysql echo -e "\n"
else action "MySQL初始化失敗請查看${data_dir}/error.log日誌" /bin/false exit fi } function Set_System_Server_And_Init(){ echo -e "\033[44;30m開始設置MySQL開機自啓 firewalld 全局環境變量 啓動腳本 \033[0m" decode_dir=${decode_dir:-/usr/local} cd ${decode_dir}/mysql/support-files && cp mysql.server /etc/init.d/mysqld [[ $? -eq 0 ]] && action "服務腳本拷貝成功" /bin/true || action "服務腳本拷貝失敗" /bin/false
if ([[ ${decode_dir} != "/usr/local" ]] || [[ ${decode_dir} != "/usr/local/" ]]);then sed -i "s#^basedir=.*#basedir=${decode_dir}/mysql#g" /etc/init.d/mysqld fi if ([[ ${data_dir} != "/usr/local/mysql/data" ]] || [[ ${data_dir} != "/usr/local/mysql/data/" ]]);then sed -i "s#^datadir=.*#datadir=${data_dir}#g" /etc/init.d/mysqld fi echo "export PATH=${decode_dir}/mysql/bin:$PATH" >> ~/.bash_profile && source ~/.bash_profile chkconfig --level 35 mysqld on [[ $? -eq 0 ]] && action "設置開機自啓成功" /bin/true || action "設置開機自啓失敗" /bin/false firewall-cmd --zone=public --add-port=3306/tcp --permanent && systemctl restart firewalld.service [[ $? -eq 0 ]] && action "防火牆規則設置成功" /bin/true || action "防火牆規則設置失敗,請檢查firewalld服務!" /bin/false echo -e "\n" } function Start_Mysql(){ echo -e "\033[44;30m開始啓動MySQL服務\033[0m"
/etc/init.d/mysqld start &> /dev/null [[ $? -eq 0 ]] && action "啓動成功..." /bin/true || action "啓動失敗,請查看${data_dir}/error.log日誌" /bin/false echo -e "\n" echo -e "\033[41;30m使用 ALTER USER 'root'@'localhost' IDENTIFIED BY 'YOURPASSWD' 命令設置MySQL root用戶本地登陸密碼\033[0m" echo -e "\033[41;30m使用 GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY 'YOUR PASSWD' WITH GRANT OPTION; 命令設置MySQL root用戶遠程登陸密碼\033[0m" echo -e "\033[41;30m密碼強度要求包含 大小寫字母、特殊字符、數字\033[0m" } function Main(){ Check_Mysql_Service; Mysql_Num_Version_Check; Decode_Mysql; Mysql_User; Create_AND_Modify_Config_File; Init_Mysql; Set_System_Server_And_Init; Start_Mysql; } Main;
MySQL二進制文件下載地址:http://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-5.7/mysql