mysql 8.0多实例批量部署script
一、背景
最近一个项目上,一台linux需要部署mysql 8.0多实例,为了加快部署的速度,写了一个脚本。
二、解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 | #!/bin/bash #download mysql package package= "mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz" echo -n "please input start_port:" read start_port echo -n "please input end_port:" read end_port pts=$( seq ${start_port} ${end_port}) echo -n "please input innodb_pool_size,eg 512M,2G:" read pool_size innodb_pool_size=${pool_size} echo -n "please input data_base dir:" read base_dir data_root=${base_dir} #test network connecting ping -c 3 www.baidu.com if test $? - eq 0; then mkdir software && cd software #download package wget https: //downloads .mysql.com /archives/get/p/23/file/ $package fi #create mysql user and group if test ` cat /etc/passwd | grep mysql`; then echo "mysql user already exist" else useradd -M -s /sbin/nologin mysql fi #unzip mysql package xz -dk $package; tar -xvf $( basename ${package} .xz) package_dir=$( basename ${package} . tar .xz) for pt in $pts; do mkdir -p ${data_root}/$pt cp -rpf ${package_dir}/* ${data_root}/$pt && mkdir -p ${data_root}/$pt /data chown -R mysql:mysql ${data_root}/$pt #config mysql configfile cat > /etc/my $pt.cnf<<EOF [mysql] auto-rehash socket =${data_root}/$pt /data/mysql $pt.sock # /tmp/mysql.sock [mysqld] ####: for global user =mysql server_id =$pt # 1 port =$pt mysqlx =0 basedir =${data_root}/$pt/ # /usr/local/mysql/ datadir =${data_root}/$pt /data # /usr/local/mysql/data/ max_prepared_stmt_count =1048576 # 16382 open_files_limit =65536 # 65536 socket =${data_root}/$pt /data/mysql $pt.sock # /tmp/mysql.sock skip_name_resolve =1 # 0 super_read_only =OFF # OFF sql_require_primary_key =ON # OFF cte_max_recursion_depth =1000 # 1000 log_timestamps =system # UTC lower_case_table_names =1 # 0 auto_increment_increment =1 # 1 auto_increment_offset =1 # 1 lock_wait_timeout =31536000 # ! for metadata lock wait event_scheduler =OFF # ON auto_generate_certs =ON # ON big_tables =OFF # OFF ! for TempTable storage engine join_buffer_size =256k # 0.25M activate_all_roles_on_login =ON # OFF end_markers_in_json =OFF # OFF tmpdir = /tmp/ max_connections =512 # 151 autocommit =ON # ON sort_buffer_size =262144 # 262144(256k) ! fix too many Sort_merge_passes per second # # in SHOW GLOBAL STATUS output; speed up ORDER BY or GROUP BY operations ####: for table cache table_open_cache =4000 # 2000 table_definition_cache =2000 # 1400 table_open_cache_instances =32 # 16 ####: for net max_allowed_packet =64M # 64M bind_address =* # * connect_timeout =10 # 10 interactive_timeout =28800 # 28800 net_read_timeout =30 # 30 net_retry_count =10 # 10 net_write_timeout =60 # 60 net_buffer_length =32k # 16384(16k) ####: for logs log_output =FILE # FILE ## -- general log general_log =OFF # OFF general_log_file =general.log # hotname.log ## -- error log log_error =err.log # stderr log_statements_unsafe_for_binlog =ON # ! for error 1592 ## -- slow log long_query_time =2.0 # 10.000000 log_queries_not_using_indexes =OFF # OFF log_slow_admin_statements =OFF # OFF log_slow_slave_statements =OFF # OFF slow_query_log =ON # OFF slow_query_log_file =slow.log # slow.log ####: for binlog log_bin =mysql-bin binlog_checksum =none # CRC32 log_bin_trust_function_creators =ON # OFF binlog_direct_non_transactional_updates =OFF # OFF binlog_expire_logs_seconds =604800 # 2592000(30days) | 604800(7days) binlog_error_action =ABORT_SERVER # ABORT_SERVER | IGNORE_ERROR binlog_format =ROW # ROW | STATEMENT | MIXED max_binlog_stmt_cache_size =1G # 18446744073709547520 max_binlog_cache_size =1G # 18446744073709547520(1G) max_binlog_size =1G binlog_order_commits =ON # ON binlog_row_image =FULL # FULL | MINIMAL | NOBLOB binlog_row_metadata =MINIMAL # MINIMAL | FULL binlog_rows_query_log_events =ON # OFF sync_binlog =1 # 1 | 0 | N binlog_stmt_cache_size =32k # 32768(32k) log_slave_updates =ON # ON binlog_group_commit_sync_delay =4000 # 0 binlog_group_commit_sync_no_delay_count =10 # 0 binlog_cache_size =96k # 32768(32k) binlog_transaction_dependency_history_size =25000 # 25000 binlog_transaction_dependency_tracking =WRITESET # COMMIT_ORDER | WRITESET | WRITESET_SESSION ####: for storage engine default_storage_engine =innodb # InnoDB default_tmp_storage_engine =innodb # InnoDB internal_tmp_mem_storage_engine =TempTable # TempTable ####: for innodb ## disk I/O and file space management innodb_data_home_dir =./ # ./ innodb_data_file_path =ibdata1:256M;ibdata2:256M:autoextend # ibdata1:12M:autoextend innodb_page_size =16k # 16384(16k) innodb_default_row_format =dynamic # dynamic | compact | redundant innodb_log_group_home_dir =./ # ./ innodb_log_files_in_group =8 # 2 innodb_log_file_size =128M # 50331648(48M) innodb_log_buffer_size =256M # 16777216(16M) innodb_redo_log_encrypt =OFF # OFF innodb_online_alter_log_max_size =128M # 134217728(128M) innodb_undo_directory =./ # ./ innodb_undo_log_encrypt =OFF # OFF innodb_undo_log_truncate =ON # ON innodb_max_undo_log_size =1G # 1073741824(1G) innodb_rollback_on_timeout =OFF # OFF innodb_rollback_segments =128 # 128 [1~128] innodb_log_checksums =ON # ON innodb_checksum_algorithm =crc32 # crc32 innodb_log_compressed_pages =ON # ON innodb_doublewrite =ON # ON ! do not disable it please. innodb_commit_concurrency =0 # 0 ## configuring innodb readonly innodb_read_only =OFF # OFF ## configuring innodb dedicated server innodb_dedicated_server =OFF # OFF ! related to mysql auto config please donot chanage ## configuring innodb buffer pool size and instances innodb_buffer_pool_chunk_size =128M # 134217728(128M) innodb_buffer_pool_size =${innodb_pool_size} # 134217728(128M) innodb_buffer_pool_instances =10 # 1 ## making the buffer pool scan resistant innodb_old_blocks_pct =37 # 37 innodb_old_blocks_time =1000 # 1000 ## configuring innodb buffer pool prefetching(read ahead) innodb_random_read_ahead =off # OFF innodb_read_ahead_threshold =56 # 56 ## configuring innodb buffer pool flushing innodb_max_dirty_pages_pct_lwm =20 # 10 innodb_max_dirty_pages_pct =90 # 90 ## fine-tuning innodb buffer pool flushing innodb_flush_neighbors =0 # off | on (off for ssd ,on for hdd) innodb_lru_scan_depth =1024 # 1024 ## tuning for sharp checkpoint innodb_adaptive_flushing =ON # ON innodb_adaptive_flushing_lwm =10 # 10 innodb_flushing_avg_loops =30 # 30(a heih value means adaptive flushing is slow) ## saving and restoring the buffer pool state innodb_buffer_pool_dump_pct =50 # 50 innodb_buffer_pool_dump_at_shutdown =ON # ON innodb_buffer_pool_load_at_startup =ON # ON innodb_buffer_pool_filename =ib_buffer_pool # ib_buffer_pool innodb_stats_persistent =ON # ON innodb_stats_on_metadata =ON # OFF innodb_stats_method =nulls_equal # nulls_equal innodb_stats_auto_recalc =ON # ON innodb_stats_include_delete_marked =ON # ON innodb_stats_persistent_sample_pages=20 # 20 innodb_stats_transient_sample_pages =8 # 8 innodb_status_output =OFF # OFF innodb_status_output_locks =OFF # OFF innodb_buffer_pool_dump_now =OFF # OFF innodb_buffer_pool_load_abort =OFF # OFF innodb_buffer_pool_load_now =OFF # OFF ## configuring thread concurrency for innodb innodb_thread_concurrency =0 # 0 #? if innodb_thread_concurrency is 0, the value of innodb_thread_sleep_delay is ignored; #? so default the next 3 are ignored. innodb_concurrency_tickets =5000 # 5000 innodb_thread_sleep_delay =15000 # 4000 ( 4ms) innodb_adaptive_max_sleep_delay =150000 # 150000 (15/100 s) ## configuring the number of background innoDB i/o threads #? if you see more than 64 × innodb_read_io_threads pending read requests in #? SHOW ENGINE INNODB STATUS output, you might improve performance #? by increasing the value of innodb_read_io_threads. innodb_read_io_threads =4 # 4 innodb_write_io_threads =4 # 4 ## using asynchronous i/o on linux #? 1):perform read-ahead and write requests for data file pages. #? 2):Too many I/O write requests dispatched to the operating system for parallel processing could, #? in some cases, result in I/O read starvation innodb_use_native_aio =ON # ON ## configuring the innodb master thread i/o rate innodb_flush_sync =OFF # ON #? To adhere to the limit on InnoDB background I/O activity defined by the innodb_io_capacity setting, #? disable innodb_flush_sync. innodb_io_capacity =4000 # 200 innodb_io_capacity_max =20000 # 2000 ## configuring spin lock polling innodb_spin_wait_delay =6 # 6 ## configuring innoDB purge scheduling innodb_purge_threads =4 # 4 innodb_purge_batch_size =300 # 300(300 undo log page) innodb_purge_rseg_truncate_frequency=128 # 128 ## -- Lock & Wait innodb_deadlock_detect =ON # ON innodb_autoinc_lock_mode =2 # 0 | 1 | 2 innodb_print_all_deadlocks =ON # OFF innodb_lock_wait_timeout =50 # 50 innodb_table_locks =ON # ON innodb_sync_array_size =1 # 1 innodb_sync_spin_loops =30 # 30 ## innodb others innodb_print_ddl_logs =OFF # OFF innodb_replication_delay =0 # 0 innodb_cmp_per_index_enabled =OFF # ! do not enable it please. innodb_disable_sort_file_cache =OFF # OFF innodb_numa_interleave =OFF # OFF innodb_strict_mode =ON # ON innodb_sort_buffer_size =1M # 1M(global and only for full-text search) innodb_fast_shutdown =1 # 0 | 1 | 2 innodb_force_load_corrupted =OFF # OFF innodb_force_recovery =0 # 0 | 1 | 2 | 3 | 4 | 5 | 6 innodb_temp_tablespaces_dir =./ #innodb_temp/ # ./#innodb_temp/ innodb_tmpdir =./ # ! the sort file temp dir of alter table opration innodb_temp_data_file_path =ibtmp1:64M:autoextend # ibtmp1:12M:autoextend ! stores rollback segments for changes made to user-created temporary tables. innodb_page_cleaners =4 # 1 ## adaptive hash index innodb_adaptive_hash_index =ON # ON innodb_adaptive_hash_index_parts =8 # 8 ## -- Flush & Io innodb_flush_log_at_timeout =1 # 1 innodb_flush_log_at_trx_commit =1 # 1 | 0 | 2 innodb_flush_method =O_DIRECT # fsync | o_direct innodb_fsync_threshold =0 # 0 ~ 2**64-1 innodb_change_buffer_max_size =25 # 25 innodb_change_buffering =all # all | none | inserts | deletes | changes | purges ####: others div_precision_increment =4 # 4 eq_range_index_dive_limit =200 # 200 explicit_defaults_for_timestamp =ON # ON group_concat_max_len =1024 # 1024 flush =OFF # OFF flush_time =0 # 0 automatic_sp_privileges =ON # ON innodb_fill_factor =90 # 100 innodb_file_per_table =ON # ON innodb_autoextend_increment =64 # 64 innodb_open_files =64000 # 4000 ####: for authentication caching_sha2_password_auto_generate_rsa_keys =ON # ON caching_sha2_password_private_key_path =private_key.pem # private_key.pem caching_sha2_password_public_key_path =public_key.pem # public_key.pem default_authentication_plugin =caching_sha2_password # caching_sha2_password default_password_lifetime =0 # 0 disconnect_on_expired_password =ON # ON ####: for character character_set_server =utf8mb4 # utf8mb4 collation_server =utf8mb4_0900_ai_ci # utf8mb4_0900_ai_ci ####: for optimizer optimizer_prune_level =1 optimizer_search_depth =62 optimizer_switch =index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on optimizer_trace =enabled=off,one_line=off optimizer_trace_features =greedy_search=on,range_optimizer=on,dynamic_range=on,repeated_subselect=on optimizer_trace_limit =1 optimizer_trace_max_mem_size =1048576 optimizer_trace_offset =-1 #### for performance_schema performance_schema =on # on performance_schema_consumer_global_instrumentation =on # on performance_schema_consumer_thread_instrumentation =on # on performance_schema_consumer_events_stages_current =on # off performance_schema_consumer_events_stages_history =on # off performance_schema_consumer_events_stages_history_long =off # off performance_schema_consumer_statements_digest =on # on performance_schema_consumer_events_statements_current =on # on performance_schema_consumer_events_statements_history =on # on performance_schema_consumer_events_statements_history_long =off # off performance_schema_consumer_events_waits_current =on # off performance_schema_consumer_events_waits_history =on # off performance_schema_consumer_events_waits_history_long =off # off performance-schema-instrument = 'memory/%=COUNTED' EOF ##config mysql startup script cat <<EOF > /etc/init .d /mysql $pt port=$pt mysql_user="mysql" cmdpath="${data_root}/${pt}/bin" mysql_sock="${data_root}/${pt}/data/mysql$pt.sock" #pidname="$(hostname)" mysqld_pid_file_path="${data_root}/${pt}/data/$(hostname).pid" start(){ if [ ! -e "\$mysql_sock" ];then printf "Starting MySQL...\n" \${cmdpath}/mysqld --defaults-file=/etc/my${pt}.cnf --user=\${mysql_user} 2>/dev/null & sleep 3 else printf "MySQL is running...\n" exit 1 fi } stop(){ if [ ! -e "\$mysql_sock" ];then printf "MySQL is stopped...\n" exit 1 else printf "Stoping MySQL...\n" mysqld_pid=\`cat "\$mysqld_pid_file_path"\` if (kill -0 \$mysqld_pid 2>/dev/null) then kill \$mysqld_pid sleep 2 else rm \$mysqld_pid_file_path fi fi } restart(){ printf "Restarting MySQL...\n" stop sleep 2 start } case "\$1" in start) start ;; stop) stop ;; restart) restart ;; *) printf "Usage: /etc/init.d/mysql${pt} {start|stop|restart}\n" esac EOF #initial mysqlserver ${data_root}/$pt /bin/mysqld --defaults- file = /etc/my $pt.cnf --initialize --basedir=${data_root}/$pt #startup mysqlserver chmod 755 /etc/init .d /mysql ${pt} /etc/init .d /mysql ${pt} start if [ $? - eq 0 ]; then sleep 20 #modify mysqlserver password export MYSQL_PWD=$( cat ${data_root}/$pt /data/err .log | grep password | awk -F 'root@localhost:' '{print $NF}' | sed 's/^[][ ]*//g' ) ${data_root}/$pt /bin/mysql --connect-expired-password -hlocalhost -uroot -P${pt} -S ${data_root}/${pt} /data/mysql $pt.sock -e "alter user root@localhost identified by 'Rootasdf2023';" if [ $? - eq 0 ]; then echo "MySQL INSTANCE $pt is install sucessed!" else echo "MySQL INSTANCE $pt is install maybe failed!please you check" fi fi done |
三、脚本说明
1、配置文件参数是mysql 8.0
2、安装成功后root的初始密码是:Rootasdf2023
3、运行脚本时,只需要输入开始端口号,结束端口号、innodb_buffer_size的大小、安装目录即可。
喜欢请赞赏一下啦^_^
微信赞赏

支付宝赞赏

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步