目录
6、初始化各个实例 [ 初始化完成后会自带随机密码在输出日志中 ]
写在最前:
清理干净系统 MySQL 相关(参考命令 ➡️ sudo find / -name mysql | sudo xargs rm -rf , ➡️ sudo find / -name my.cnf | sudo xargs rm -rf)
下载正确的 Mac 环境 MySQL 源码编译包:http://ftp.ntu.edu.tw/pub/MySQL/Downloads/ (选择你想要的版本,下载 mysql-boost-.... 的安装包)
我所选择的为:mysql-boost-5.7.28.tar.gz(有没有发现不同❓暂时留给你思考的空间,后续会详细介绍)
一、千锤百炼 Boost 库
Boost 库是一个经过千锤百炼、可移植、提供源代码的 C++ 库,作为标准库的后备,是 C++ 标准化进程的发动机之一。
MySQL 源码编译安装必须用到 Boost 库,但是 Mac 环境无法直接下载如 boost_1_59_0.tar.bz2 解压后直接使用,所以在 Mac 环境源码安装必须选择集成的如 mysql-boost-5.7.28.tar.gz 的安装包。
二、编译安装 MySQL
1、创建自己的目录,放置安装包
➡️ mkdir -p /data/soft
➡️ cd /data/soft
将 mysql-boost-5.7.28.tar.gz 下载到 /data/soft 下
2、解压
➡️ sudo chmod 755 mysql-boost-5.7.28.tar.gz
➡️ tar -zxvf mysql-boost-5.7.28.tar.gz
3、编译、安装
➡️ cd mysql-5.7.28
注意 cmake 各参数配置,根据自己的需求修改
➡️ cmake -DCMAKE_INSTALL_PREFIX=/data/mysql-5.7.28 -DMYSQL_DATADIR=/data/mysql-5.7.28/data -DSYSCONFDIR==/data/mysql-5.7.28/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR=/data/mysql-5.7.28/etc/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DDEFAULT_COLLATION=utf8mb4_general_ci -DWITH_READLINE=1 -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DENABLE_DOWNLOADS=1 -DWITH_BOOST=/data/soft/mysql-5.7.28/boost
➡️ make
➡️ make install
4、变更所属组、用户
➡️ sudo chown -R _mysql:_mysql /data/mysql-5.7.28
5、创建多实例数据、日志等文件存放路径
➡️ mkdir -p /data/mysql5.7.28data/mysql3701
➡️ mkdir -p /data/mysql5.7.28data/mysql3702
➡️ mkdir -p /data/mysql5.7.28log/mysql3701/binlogs
➡️ mkdir -p /data/mysql5.7.28log/mysql3702/binlogs
➡️ mkdir -p /data/mysql5.7.28log/mysql3701/relaylogs
➡️ mkdir -p /data/mysql5.7.28log/mysql3702/relaylogs
➡️ sudo chown -R _mysql:_mysql /data/mysql5.7.28data
➡️ sudo chown -R _mysql:_mysql /data/mysql5.7.28log
6、初始化各个实例 [ 初始化完成后会自带随机密码在输出日志中 ]
注意:根据自己需求创建多个实例,单实例只需要创建一个就可以了,上面一步同理
➡️ sudo /data/mysql-5.7.28/bin/mysqld --initialize --user=mysql --basedir=/data/mysql-5.7.28/ --datadir=/data/mysql5.7.28data/mysql3701/data
2019-12-20T11:00:07.220085Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). |
➡️ sudo /data/mysql-5.7.28/bin/mysqld --initialize --user=mysql --basedir=/data/mysql-5.7.28/ --datadir=/data/mysql5.7.28data/mysql3702/data
2019-12-20T09:14:10.885872Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). |
7、各实例开启SSL连接(可选)
➡️ /data/mysql-5.7.28/bin/mysql_ssl_rsa_setup --user=mysql --basedir=/data/mysql-5.7.28/ --datadir=/data/mysql5.7.28data/mysql3701/data
➡️ /data/mysql-5.7.28/bin/mysql_ssl_rsa_setup --user=mysql --basedir=/data/mysql-5.7.28/ --datadir=/data/mysql5.7.28data/mysql3702/data
三、配置 MySQL 配置文件
➡️ sudo vim /etc/my.cnf
1、多实例
[client]
default-character-set = utf8mb4
port=3306
socket=/data/mysql-5.7.28/etc/mysql.sock
[mysqldump]
quick
max_allowed_packet = 16M
[mysqld]
port = 3306
server-id=11370
user=mysql
socket=/data/mysql-5.7.28/etc/mysql.sock
sync_binlog = 1
innodb_old_blocks_time = 1000
innodb_flush_method = O_DIRECT
back_log = 1000
report_host=172.18.4.181
basedir = /data/mysql-5.7.28
table_open_cache = 13684
skip-character-set-client-handshake
binlog_cache_size=32M
query_cache_limit = 2M
max_connections = 13684
max_user_connections = 13684
query_cache_size = 256M
query_cache_type = 0
log_queries_not_using_indexes = 1
min_examined_row_limit =100000
key_buffer_size = 1M
read_buffer_size = 1M
sort_buffer_size = 1M
# write_buffer = 2M
max_allowed_packet = 64M
max_connect_errors = 1000000
# net_buffer_length = 8K
# read_rnd_buffer_size = 16M
event_scheduler = 1
lower_case_table_names = 1
# general_log= on
binlog_format = 'ROW'
log-error=/data/mysql5.7.28log/mysqld-5.7-err.log
slow_query_log = on
slow-query-log-file = /data/mysql5.7.28log/slow.log
long_query_time = 1
expire_logs_days = 30
connect_timeout = 300
wait_timeout = 300
interactive_timeout = 300
join_buffer_size = 8M
thread_cache_size = 512
thread_stack = 256K
tmp_table_size = 256M
max_heap_table_size = 256M
bulk_insert_buffer_size = 64M
# innodb_autoextend_increment = 256
# innodb_data_file_path=ibdata1:12M:autoextend
innodb_buffer_pool_instances = 8
innodb_read_io_threads = 8
innodb_write_io_threads = 4
innodb_thread_concurrency = 80
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 96M
innodb_log_file_size = 10G
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 80
innodb_lock_wait_timeout = 120
innodb_file_per_table = 1
# skip_networking = ON
# query_cache_min_res_unit = 4K
log_timestamps=SYSTEM
sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
[mysqld3701]
port = 3701
server-id=330603701
user=mysql
socket=/data/mysql5.7.28data/mysql3701/mysql.sock
pid-file=/data/mysql5.7.28data/mysql3701/mysqld.pid
datadir=/data/mysql5.7.28data/mysql3701/data/
innodb_data_home_dir=/data/mysql5.7.28data/mysql3701/data/
innodb_log_group_home_dir=/data/mysql5.7.28data/mysql3701/data/
innodb_buffer_pool_size = 1G
log_bin = /data/mysql5.7.28log/mysql3701/binlogs/log_bin
relay_log=/data/mysql5.7.28log/mysql3701/relaylogs/relay-bin
character_set_server = utf8mb4
#跳过mysql程序起动时的字符参数设置 ,使用服务器端字符集设置
skip_character_set_client_handshake = 1
collation_server = utf8mb4_bin
init_connect = 'SET NAMES utf8mb4'
group_concat_max_len=102400
bind_address = 0.0.0.0
skip-name-resolve = 0
[mysqld3702]
port = 3702
server-id=330603702
user=mysql
socket=/data/mysql5.7.28data/mysql3702/mysql.sock
pid-file=/data/mysql5.7.28data/mysql3702/mysqld.pid
datadir=/data/mysql5.7.28data/mysql3702/data/
innodb_data_home_dir=/data/mysql5.7.28data/mysql3702/data/
innodb_log_group_home_dir=/data/mysql5.7.28data/mysql3702/data/
innodb_buffer_pool_size = 1G
log_bin = /data/mysql5.7.28log/mysql3702/binlogs/log_bin
relay_log=/data/mysql5.7.28log/mysql3702/relaylogs/relay-bin
character_set_server = utf8mb4
#跳过mysql程序起动时的字符参数设置 ,使用服务器端字符集设置
skip_character_set_client_handshake = 1
collation_server = utf8mb4_bin
init_connect = 'SET NAMES utf8mb4'
group_concat_max_len=102400
bind_address = 0.0.0.0
skip-name-resolve = 0
[mysqld_multi]
mysqld=/data/mysql-5.7.28/bin/mysqld_safe
mysqladmin=/data/mysql-5.7.28/bin/mysqladmin
log=/data/mysql5.7.28log/mysql_multi.log
2、单实例
[mysqldump]
quick
max_allowed_packet = 16M
[mysqld]
port = 3701
server-id=330603701
user=mysql
socket=/data/mysql5.7.28data/mysql3701/mysql.sock
pid-file=/data/mysql5.7.28data/mysql3701/mysqld.pid
datadir=/data/mysql5.7.28data/mysql3701/data/
innodb_data_home_dir=/data/mysql5.7.28data/mysql3701/data/
innodb_log_group_home_dir=/data/mysql5.7.28data/mysql3701/data/
innodb_buffer_pool_size = 1G
log_bin = /data/mysql5.7.28log/mysql3701/binlogs/log_bin
relay_log=/data/mysql5.7.28log/mysql3701/relaylogs/relay-bin
character_set_server = utf8mb4
#跳过mysql程序起动时的字符参数设置 ,使用服务器端字符集设置
skip_character_set_client_handshake = 1
collation_server = utf8mb4_bin
init_connect = 'SET NAMES utf8mb4'
group_concat_max_len=10240
bind_address = 0.0.0.0
skip-name-resolve = 0
sync_binlog = 1
innodb_old_blocks_time = 1000
innodb_flush_method = O_DIRECT
back_log = 1000
report_host=172.18.4.181
basedir = /data/mysql-5.7.28
table_open_cache = 13684
skip-character-set-client-handshake
binlog_cache_size=32M
query_cache_limit = 2M
max_connections = 13684
max_user_connections = 13684
query_cache_size = 256M
query_cache_type = 0
log_queries_not_using_indexes = 1
min_examined_row_limit =100000
key_buffer_size = 1M
read_buffer_size = 1M
sort_buffer_size = 1M
# write_buffer = 2M
max_allowed_packet = 64M
max_connect_errors = 1000000
# net_buffer_length = 8K
# read_rnd_buffer_size = 16M
event_scheduler = 1
lower_case_table_names = 1
# general_log= on
binlog_format = 'ROW'
log-error=/data/mysql5.7.28log/mysqld-5.7-err.log
slow_query_log = on
slow-query-log-file = /data/mysql5.7.28log/slow.log
long_query_time = 1
expire_logs_days = 30
connect_timeout = 300
wait_timeout = 300
interactive_timeout = 300
join_buffer_size = 8M
thread_cache_size = 512
thread_stack = 256K
tmp_table_size = 256M
max_heap_table_size = 256M
bulk_insert_buffer_size = 64M
# innodb_autoextend_increment = 256
# innodb_data_file_path=ibdata1:12M:autoextend
innodb_buffer_pool_instances = 8
innodb_read_io_threads = 8
innodb_write_io_threads = 4
innodb_thread_concurrency = 80
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 96M
innodb_log_file_size = 1G
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 80
innodb_lock_wait_timeout = 120
innodb_file_per_table = 1
# skip_networking = ON
# query_cache_min_res_unit = 4K
log_timestamps=SYSTEM
sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
四、复制实例脚本到服务管理目录下
1、多实例
➡️ sudo mkdir -p /usr/local/mysql/bin/
➡️ sudo cp /data/mysql-5.7.28/support-files/mysqld_multi.server /usr/local/mysql/bin/mysqld_multi
➡️ sudo chmod +x /usr/local/mysql/bin/mysqld_multi
2、单实例
➡️ sudo mkdir -p /usr/local/mysql/bin/
➡️ sudo cp /data/mysql-5.7.28/support-files/mysql.server /usr/local/mysql/bin/mysql.server
➡️ sudo chmod +x /usr/local/mysql/bin/mysql.server
五、查看实例状态,启动
小知识:MySQL 启动时会读取配置文件 my.cnf,读取次序依次为 /etc/my.cnf、/etc/mysql/my.cnf、/usr/local/etc/my.cnf、~
1、多实例
Usage: /usr/local/mysql/bin/mysqld_multi {start|stop|report|restart}
查看状态 ➡️ /usr/local/mysql/bin/mysqld_multi report
启动 ➡️ /usr/local/mysql/bin/mysqld_multi start 3701
2、单实例
Usage: /usr/local/mysql/bin/mysql.server {start|stop|restart|reload|force-reload|status} [ MySQL server options ]
启动 ➡️ sudo /usr/local/mysql/bin/mysql.server start
查看状态 ➡️ sudo /usr/local/mysql/bin/mysql.server status
六、初次连接并修改密码
1、添加 mysql 到 /bin 目录
➡️ sudo cp /data/mysql-5.7.28/bin/mysql /bin
2、初次启动
注意,初始化时生成的初始密码为 'root'@'localhost' 密码,所以第一次必须 sudo
➡️ sudo mysql -S /data/mysql5.7.28data/mysql3701/mysql.sock -p'KwTan?>t.4gL'
mysql: [Warning] Using a password on the command line interface can be insecure. Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> |
3、修改 root 密码
当然才不会告诉你真正的 root 密码 O(∩_∩)O哈哈~
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('Wu3306@fEi2025'); mysql> flush privileges; mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'Wu3306@fEi2025' WITH GRANT OPTION; mysql> flush privileges; mysql> quit |
4、再次登录
➡️ mysql -h127.0.0.1 -P3701 -uroot -p'Wu3306@fEi2025'
mysql: [Warning] Using a password on the command line interface can be insecure. Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> mysql> select user,host from mysql.user; 【创建其它用户连接账号】 mysql> GRANT ALL PRIVILEGES ON *.* TO 'wufei_test'@'%' identified by 'wufei9ijnmko0test'; mysql> flush privileges; mysql> select user,host from mysql.user; |
5、higo_test 用户访问
➡️ mysql -h127.0.0.1 -P3701 -uwufei_test -pwufei9ijnmko0test
➡️ mysql -h172.18.4.181 -P3701 -uwufei_test -pwufei9ijnmko0test
七、MySQL 状态操作
1、多实例操作
Usage: /usr/local/mysql/bin/mysqld_multi {start|stop|report|restart}
查看状态 ➡️ /usr/local/mysql/bin/mysqld_multi report
启动 ➡️ /usr/local/mysql/bin/mysqld_multi start 3701
停止 ➡️ /usr/local/mysql/bin/mysqld_multi stop 3701--password=Wu3306@fEi2025
......
2、单实例操作
Usage: /usr/local/mysql/bin/mysql.server {start|stop|restart|reload|force-reload|status} [ MySQL server options ]
查看状态 ➡️ sudo /usr/local/mysql/bin/mysql.server status
启动 ➡️ sudo /usr/local/mysql/bin/mysql.server start
停止 ➡️ sudo /usr/local/mysql/bin/mysql.server stop
......