目录

编译安装mysql5.7

安装编译依赖

编译

设置安装路径

export INSTALL_DIR="/usr/local/mysql"
export DATA_DIR="/data/mysql"

准备工作

wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-boost-5.7.38.tar.gz
tar xf mysql-boost-5.7.38.tar.gz && cd mysql-5.7.38
[[ -d build ]] && rm -r build
mkdir -p build && cd build

开始编译

cmake .. \
    -DBUILD_CONFIG=mysql_release \
    -DFEATURE_SET="community" \
    -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \
    -DWITH_EMBEDDED_SERVER=off \
    -DINSTALL_SBINDIR=bin \
    -DINSTALL_SCRIPTDIR=bin \
    -DINSTALL_LIBDIR=lib/mysql \
    -DINSTALL_PLUGINDIR=lib/plugin \
    -DINSTALL_INCLUDEDIR=include \
    -DINSTALL_INFODIR=share/info \
    -DINSTALL_MANDIR=share/man \
    -DINSTALL_MYSQLSHAREDIR=share/mysql \
    -DINSTALL_SUPPORTFILESDIR=share/mysql \
    -DINSTALL_MYSQLTESTDIR=mysql-test \
    -DDEFAULT_CHARSET=utf8 \
    -DDEFAULT_COLLATION=utf8_general_ci \
    -DEXTRA_CHARSETS=all \
    -DENABLED_LOCAL_INFILE=ON \
    -DWITH_LIBEVENT=bundled \
    -DWITH_SSL=bundled \
    -DWITH_ZLIB=bundled \
    -DWITH_INNODB_MEMCACHED=on \
    -DWITH_BOOST=../boost \
    -DWITH_UNIT_TESTS=on \
    -DWITH_DEBUG=off

make -j4 && make install
# 根据cpu核心数设置,直接make也行

收尾

创建目录和用户

mkdir -p ${DATA_DIR}/{binlog,data,logs,redolog,relaylog,tmp,undolog}
mkdir -p ${INSTALL_DIR}/etc
groupadd -g 27 -o -r mysql
useradd -M -g mysql -o -r -d /dev/null -s /sbin/nologin -u 27 mysql 
chown -R mysql. ${DATA_DIR}

创建配置文件

cat > ${INSTALL_DIR}/etc/my.cnf <<-EOF
## MySQL 5.7 Configuration File

[mysqld]

## General
user                                   = mysql
bind_address                           = 0.0.0.0
port                                   = 3306
basedir                                = ${INSTALL_DIR}/
datadir                                = ${DATA_DIR}/data
tmpdir                                 = ${DATA_DIR}/tmp
socket                                 = ${DATA_DIR}/logs/mysql.sock
pid-file                               = ${DATA_DIR}/logs/mysqld.pid

character_set_server                   = utf8
sql_mode                               = NO_ENGINE_SUBSTITUTION  # default "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
transaction_isolation                  = READ-COMMITTED    # default REPEATABLE-READ
explicit_defaults_for_timestamp        = ON     # default OFF
secure_file_priv                       =

skip-symbolic-links
skip_name_resolve                      = ON
skip_external_locking                  = ON

performance_schema                     = ON      # default ON
performance-schema-instrument          = 'memory/%=ON'
autocommit                             = ON      # default ON
#event_scheduler                        = ON     # default OFF
#lower_case_table_names                 = 0      # default 0
show_compatibility_56                  = ON      # >= 5.7.8 default OFF

## ssl
#ssl_ca                                 = ${DATA_DIR}/ssl/ca.pem
#ssl_cert                               = ${DATA_DIR}/ssl/server-cert.pem
#ssl_key                                = ${DATA_DIR}/ssl/server-key.pem

## Networking
back_log                               = 1000
max_connections                        = 1100
max_user_connections                   = 1000
max_connect_errors                     = 1000000
interactive_timeout                    = 300
wait_timeout                           = 300
connect_timeout                        = 10
net_buffer_length                      = 1M
max_allowed_packet                     = 256M

## Cache
thread_cache_size                      = 192     # since 5.6.8 default -1, autosized ( max_connections / 100 ) + 8
table_open_cache                       = 4096
table_definition_cache                 = 4096
table_open_cache_instances             = 8
query_cache_type                       = 0
query_cache_size                       = 0
#query_cache_size                       = 32M
#query_cache_limit                      = 1M
#query_cache_min_res_unit               = 2K

## Per_thread Buffers
sort_buffer_size                       = 32M     # default 256K
read_buffer_size                       = 16M     # default 256K
read_rnd_buffer_size                   = 32M     # default 256K
join_buffer_size                       = 128M    # default 256K
bulk_insert_buffer_size                = 64M
thread_stack                           = 256K    # default 192K

## Temp Tables
tmp_table_size                         = 512M
max_heap_table_size                    = 512M

## Sort
max_length_for_sort_data               = 2048    # default 1024
eq_range_index_dive_limit              = 200     # default 10

### Storage Engines
default_storage_engine                 = InnoDB

## MyISAM
key_buffer_size                        = 512M
myisam_sort_buffer_size                = 256M    # default 8M, for change index
myisam_max_sort_file_size              = 10G
myisam_repair_threads                  = 1
myisam_recover_options                 = default

## InnoDB
innodb_file_per_table                  = ON
innodb_file_format_check               = ON
innodb_checksum_algorithm              = crc32
innodb_page_size                       = 16k     # default 16k
innodb_buffer_pool_size                = 2G      # default 1G, = innodb_buffer_pool_instances * innodb_buffer_pool_chunk_size * n
innodb_buffer_pool_instances           = 8       # since 5.6.6 if innodb_buffer_pool_size < 1G default 1 else 8
innodb_buffer_pool_chunk_size          = 128M    # defautl 128M
innodb_data_file_path                  = ibdata1:100M:autoextend
innodb_temp_data_file_path             = ../tmp/ibtmp1:12M:autoextend
innodb_log_group_home_dir              = ${DATA_DIR}/redolog/
innodb_log_file_size                   = 1G
innodb_log_files_in_group              = 2
innodb_log_buffer_size                 = 16M
innodb_rollback_segments               = 128     # defautl 128
innodb_undo_directory                  = ${DATA_DIR}/undolog/
innodb_undo_tablespaces                = 4       # from 5.7.21 deprecated
innodb_open_files                      = 4000
innodb_thread_concurrency              = 32
innodb_flush_log_at_trx_commit         = 1
innodb_flush_log_at_timeout            = 1       # defautl 1, when innodb_flush_log_at_trx_commit = 0 or 2
innodb_purge_threads                   = 4
innodb_print_all_deadlocks             = ON
innodb_max_dirty_pages_pct             = 70
innodb_lock_wait_timeout               = 50
innodb_flush_method                    = O_DIRECT
innodb_old_blocks_time                 = 1000    # since 5.6.6 default 1000
innodb_io_capacity                     = 600     # default 200
innodb_io_capacity_max                 = 2000    # default 2000
innodb_lru_scan_depth                  = 1024    # default 1024
innodb_read_io_threads                 = 8
innodb_write_io_threads                = 8
innodb_buffer_pool_load_at_startup     = ON
innodb_buffer_pool_dump_at_shutdown    = ON
innodb_buffer_pool_filename            = ib_buffer_pool  # default ib_buffer_pool
innodb_sort_buffer_size                = 64M     # default 1M , 64K - 64M , for change index

innodb_buffer_pool_dump_pct            = 40
innodb_page_cleaners                   = 16
innodb_undo_log_truncate               = ON
innodb_max_undo_log_size               = 2G
innodb_purge_rseg_truncate_frequency   = 128

## Gtid
#gtid_mode                              = ON
#enforce_gtid_consistency               = ON
#binlog_gtid_simple_recovery            = 1

## Replication
server_id                              = 101
log_bin                                = ${DATA_DIR}/binlog/mysql_bin
expire_logs_days                       = 7
binlog_format                          = ROW
binlog_row_image                       = noblob  # default full
#innodb_autoinc_lock_mode               = 2      # default 1
binlog_rows_query_log_events           = 1
max_binlog_size                        = 500M
binlog_cache_size                      = 1M
sync_binlog                            = 1
master_info_repository                 = TABLE
relay_log_info_repository              = TABLE
skip-slave-start                       = 1
relay_log                              = ${DATA_DIR}/relaylog/relay_log
max_relay_log_size                     = 500M   # default 0, use max_binlog_size
log_slave_updates                      = ON     # default OFF
#read_only                              = ON
#super_read_only                        = ON
#relay_log_purge                        = 1
#slave_net_timeout                      = 60
#replicate_wild_do_table                = mysql.%
#replicate_wild_ignore_table            = test.%
#auto_increment_offset                  = 1
#auto_increment_increment               = 2
#plugin_dir                             = ${DATA_DIR}/lib/plugin
#plugin_load                            = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
#rpl_semi_sync_master_enabled           = ON
#rpl_semi_sync_slave_enabled            = ON
#rpl_semi_sync_master_timeout           = 1000
slave_transaction_retries              = 128

## MTS
relay_log_recovery                     = 1
#slave_parallel_type                    = LOGICAL_CLOCK
#slave_parallel_workers                 = 16
#slave_preserve_commit_order            = 1

## Logging
log_output                             = FILE
slow_query_log                         = ON
slow_query_log_file                    = ${DATA_DIR}/logs/slow_mysqld.log
log_queries_not_using_indexes          = OFF     # default OFF
log_throttle_queries_not_using_indexes = 10      # default 0
min_examined_row_limit                 = 0       # default 0
log_slow_admin_statements              = ON
log_slow_slave_statements              = ON
long_query_time                        = 1
#log-short-format                       = 0
log_error                              = ${DATA_DIR}/logs/error_mysqld.log
general_log                            = OFF
general_log_file                       = ${DATA_DIR}/logs/general_mysqld.log
log_timestamps                         = system

## Index
ft_min_word_len                        = 4

[mysqld_safe]
open_files_limit                       = 65535

[mysql]
no_auto_rehash
prompt                                 = "MySQL [\\d] > "

[mysqldump]
quick
max_allowed_packet                     = 256M

[myisamchk]
key_buffer_size                        = 64M
sort_buffer_size                       = 32M
read_buffer                            = 8M
write_buffer                           = 8M

[mysqlhotcopy]
interactive_timeout

[client]
socket                                 = ${DATA_DIR}/logs/mysql.sock

EOF

创建软链接

my.cnf文件客户端和服务端都需要使用的。

sudo ln -s ${INSTALL_DIR}/etc/my.cnf /etc/my.cnf

创建service文件

sudo cp ${INSTALL_DIR}/share/mysql.service /etc/init.d/
sudo systemctl daemon-reload

初始化数据库

./bin/mysqld --initialize-insecure      # 空密码, 可以通过mysql命令登录
./bin/mysqld --initialize               # 随机密码,看error_log