暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

centos7.9安装mysql8.4.2(glibc)

原创 vic 2024-12-19
63

一、环境准备

(一)安装包下载

##查看当前系统对应glibc版本,下载对应包,当前是2.17,下载对应2.17的包 [root@db1:/home]# rpm -qa |grep glibc glibc-common-2.17-326.el7_9.3.x86_64 glibc-2.17-326.el7_9.3.x86_64 glibc-headers-2.17-326.el7_9.3.x86_64 glibc-devel-2.17-326.el7_9.3.x86_64 ##查看系统cpu架构 [root@db1:/home]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit ##根据对应的glibc版本以及cpu架构下载对应的包。可在线下载或直接下载后传到对应服务器 ##浏览器下载: https://downloads.mysql.com/archives/get/p/23/file/mysql-8.4.2-linux-glibc2.17-x86_64.tar.xz ##服务器wget下载: wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.4.2-linux-glibc2.17-x86_64.tar.xz
复制

(二)解压安装包及创建所需目录

##解压 tar -xvJf mysql-8.4.2-linux-glibc2.17-x86_64.tar.xz mv mysql-8.4.2-linux-glibc2.17-x86_64 /usr/local/mysql ##创建所需目录 mkdir -p /data/mysql/{data,pid,log,tmp}
复制

(三)编辑my.cnf

##在线生成mysql配置文件(可以使用叶金荣老师在线生成配置文件本的工具进行生成配置文件) 访问: https://imysql.com/my-cnf-wizard.html ##编辑配置文件 vim /etc/my.cnf [client] port = 3306 socket = /data/mysql/tmp/mysql.sock [mysql] prompt = "\u@db1 \R:\m:\s [\d]> " no_auto_rehash loose-skip-binary-as-hex [mysqld] user = mysql port = 3306 #主从复制或MGR集群中,server_id记得要不同 #另外,实例启动时会生成 auto.cnf,里面的 server_uuid 值也要不同 #server_uuid的值还可以自己手动指定,只要符合uuid的格式标准就可以 server_id = 3306 basedir = /usr/local/mysql datadir = /data/mysql/data socket = /data/mysql/tmp/mysql.sock pid_file = /data/mysql/pid/db1.pid character_set_server = UTF8MB4 skip_name_resolve = 1 #若你的MySQL数据库主要运行在境外,请务必根据实际情况调整本参数 default_time_zone = "+8:00" #启用admin_port,连接数爆满等紧急情况下给管理员留个后门 admin_address = '127.0.0.1' admin_port = 33062 ##大小写铭感 lower_case_table_names=1 #performance setttings lock_wait_timeout = 3600 open_files_limit = 65535 back_log = 1024 max_connections = 512 max_connect_errors = 1000000 table_open_cache = 10000 table_definition_cache = 10000 thread_stack = 512K sort_buffer_size = 16M join_buffer_size = 16M read_buffer_size = 8M read_rnd_buffer_size = 16M bulk_insert_buffer_size = 64M thread_cache_size = 768 interactive_timeout = 600 wait_timeout = 600 tmp_table_size = 96M max_heap_table_size = 96M #log settings log_timestamps = SYSTEM log_error = /data/mysql/log/error.log log_error_verbosity = 3 slow_query_log = 1 log_slow_extra = 1 slow_query_log_file = /data/mysql/log/slow.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 log_bin = /data/mysql/log/mybinlog binlog_format = ROW sync_binlog = 1 #MGR环境中由其他节点提供容错性,可不设置双1以提高本地节点性能 binlog_cache_size = 4M max_binlog_cache_size = 2G max_binlog_size = 1G binlog_rows_query_log_events = 1 binlog_expire_logs_seconds = 604800 #MySQL 8.0.22前,想启用MGR的话,需要设置binlog_checksum=NONE才行 binlog_checksum = CRC32 gtid_mode = ON enforce_gtid_consistency = TRUE #myisam settings key_buffer_size = 32M myisam_sort_buffer_size = 128M #replication settings relay_log_recovery = 1 slave_parallel_type = LOGICAL_CLOCK slave_parallel_workers = 64 #可以设置为逻辑CPU数量的2倍 #binlog_transaction_dependency_tracking = WRITESET slave_preserve_commit_order = 1 slave_checkpoint_period = 2 replication_optimize_for_static_plugin_config = ON replication_sender_observe_commit_only = ON #mgr settings loose-plugin_load_add = 'mysql_clone.so' loose-plugin_load_add = 'group_replication.so' loose-group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1" #MGR本地节点IP:PORT,请自行替换 loose-group_replication_local_address = "172.16.16.10:33061" #MGR集群所有节点IP:PORT,请自行替换 loose-group_replication_group_seeds = "172.16.16.10:33061,172.16.16.11:33061,172.16.16.12:33061" loose-group_replication_start_on_boot = OFF loose-group_replication_bootstrap_group = OFF loose-group_replication_exit_state_action = READ_ONLY loose-group_replication_flow_control_mode = "DISABLED" loose-group_replication_single_primary_mode = ON loose-group_replication_communication_max_message_size = 10M loose-group_replication_unreachable_majority_timeout = 30 loose-group_replication_member_expel_timeout = 5 loose-group_replication_autorejoin_tries = 288 #innodb settings transaction_isolation = REPEATABLE-READ innodb_default_row_format=DYNAMIC innodb_strict_mode=0 innodb_buffer_pool_size = 11264M innodb_buffer_pool_instances = 4 innodb_data_file_path = ibdata1:12M:autoextend innodb_flush_log_at_trx_commit = 1 #MGR环境中由其他节点提供容错性,可不设置双1以提高本地节点性能 innodb_log_buffer_size = 32M innodb_log_file_size = 1G #如果线上环境的TPS较高,建议加大至1G以上,如果压力不大可以调小 innodb_log_files_in_group = 3 loose-innodb_redo_log_capacity = 3G innodb_max_undo_log_size = 4G # 根据您的服务器IOPS能力适当调整 # 一般配普通SSD盘的话,可以调整到 10000 - 20000 # 配置高端PCIe SSD卡的话,则可以调整的更高,比如 50000 - 80000 innodb_io_capacity = 4000 innodb_io_capacity_max = 8000 innodb_open_files = 65535 innodb_flush_method = O_DIRECT innodb_lru_scan_depth = 4000 innodb_lock_wait_timeout = 10 innodb_rollback_on_timeout = 1 innodb_print_all_deadlocks = 1 innodb_online_alter_log_max_size = 4G innodb_print_ddl_logs = 1 innodb_status_file = 1 #注意: 开启 innodb_status_output & innodb_status_output_locks 后, 可能会导致log_error文件增长较快 innodb_status_output = 0 innodb_status_output_locks = 1 innodb_sort_buffer_size = 67108864 innodb_adaptive_hash_index = OFF #提高索引统计信息精确度 innodb_stats_persistent_sample_pages = 500 innodb_adaptive_hash_index = 0 loose-sql_generate_invisible_primary_key = ON #innodb monitor settings 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" #pfs settings performance_schema = 1 #performance_schema_instrument = '%memory%=on' loose-performance_schema_instrument = '%lock%=on' [mysqldump] quick
复制

(四)创建用户用户组以及授权

groupadd mysql useradd -r -g mysql mysql chmod -R 755 /data/mysql chown -R mysql:mysql /data/mysql chown -R mysql:mysql /usr/local/mysql chmod -R 755 /usr/local/mysql
复制

二、安装

(一)初始化

##将my.cnf传到/etc目录 ll /etc/my.cnf -rw-r--r-- 1 root root 5669 Dec 18 11:12 /etc/my.cnf ##初始化操作 cd /usr/local/mysql/bin ./mysqld --initialize --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql --lower_case_table_names=1 ##--defaults-file指定配置文件 ##--initialize初始化 ##--basedir 安装目录 ##--datadir 数据目录 ## --lower_case_table_names 不区分大小写
复制

(二)编辑启动文件

##拷贝配置文件到启动目录 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql ##更改权限 chmod 755 /etc/init.d/mysql ##更改配置文件内容,主要是datadir和basedir vim /etc/init.d/mysql #!/bin/sh # Copyright Abandoned 1996 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: 2345 64 36 # 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: 2 3 4 5 # Default-Stop: 0 1 6 # 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=<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=/usr/local/mysql datadir=/data/mysql/data # Default value, in seconds, afterwhich the script should timeout waiting # for server start. # Value here is overriden by value in my.cnf. # 0 means don't wait at all # Negative numbers mean to wait indefinitely service_startup_timeout=900 # 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=$1 # start or stop [ $# -ge 1 ] && 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=1 ;; --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=0 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 1 ;; esac # if server isn't running, then pid-file will never be updated if test -n "$pid"; then if kill -0 "$pid" 2>/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 1 # not waiting any more. fi fi echo $echo_n ".$echo_c" i=`expr $i + 1` sleep 1 done if test -z "$i" ; then log_success_msg return 0 else log_failure_msg return 1 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 --datadir="$datadir" --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
复制

(三)重新加载 systemd 服务:

chkconfig --add mysql systemctl daemon-reload
复制

(四)启动

##启动 systemctl start mysql ##加入到开机启动 systemctl enable mysql ##查看启动状态 systemctl status mysql
复制

(五)配置环境变量

##配置环境变量 vim /etc/profile export MY_HOME=/usr/local/mysql export PATH=$PATH:$MY_HOME/bin source /etc/profile
复制

(六)修改密码

如果账号密码没有在初始化的日志中找到,可以使用–skip-grant-tables 模式进行修改

##关闭 MySQL 服务。 systemctl stop mysql ##进入 --skip-grant-tables 模式 mysqld --user=mysql --skip-grant-tables & ##连接mysql,回车直接进 mysql -u root ##设置 root 用户密码使用 caching_sha2_password: mysql -uroot -p UPDATE mysql.user SET authentication_string = '', plugin = 'caching_sha2_password' WHERE User = 'root' AND Host = 'localhost'; FLUSH PRIVILEGES; ##使用 ALTER USER 重新设置密码: ALTER USER 'root'@'localhost' IDENTIFIED BY '[your_password]'; FLUSH PRIVILEGES; ##退出 MySQL 并停止当前服务: exit; ##然后在命令行中执行: systemctl stop mysql ##正常启动 MySQL 服务: systemctl start mysql
复制

(七)登录mysql

[root@db1:/data/mysql/log]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 Server version: 8.4.2 MySQL Community Server - GPL Copyright (c) 2000, 2024, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. root@db1 16:32: [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论