Linux系统下自行编译安装MySQL及基础配置全过程解析_MySQL
安装依赖:
CentOS:
# yum -y install wget gcc-c++ cmake make bison ncurses-devel perl unzip
Ubuntu:(使用ubuntu下面有不少需要root权限,请注意)
代码如下:
# sudo apt-get install -y g++ gcc make libpcre3 zlib1g libbz2-dev automake cmake perl libncurses5-dev bison
添加MySQL系统用户
# groupadd mysql # useradd -r -g mysql mysql
提前建立好相关目录
# mkdir /data/logs/mysql # mkdir /data/mysql
下载MySQL源代码:
# wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.12.tar.gz
配置
# cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/server/mysql-5.6.12 \ -DMYSQL_DATADIR=/data/mysql \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DMYSQL_USER=mysql \ -DDEFAULT_CHARSET=utf8 \ -DEFAULT_COLLATION=utf8_general_ci \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DENABLE_DOWNLOADS=1
配置释义:
-DCMAKE_INSTALL_PREFIX=/usr/local/server/mysql-5.6.12 设置安装目录
-DMYSQL_DATADIR=/data/mysql 设置数据库存放目录
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock 设置UNIX socket 目录
-DMYSQL_USER=mysql 设置运行用户
-DDEFAULT_CHARSET=utf8 设置默认字符集,默认latin1
-DEFAULT_COLLATION=utf8_general_ci 设置默认校对规则,默认latin1_general_ci
-DWITH_INNOBASE_STORAGE_ENGINE=1 添加InnoDB引擎支持
-DENABLE_DOWNLOADS=1 自动下载可选文件,比如自动下载谷歌的测试包
-DMYSQL_TCP_PORT=3306 设置服务器监听端口,默认3306
-DSYSCONFDIR=/data/etc 设置my.cnf所在目录,默认为安装目录
更多参数执行 # cmake . -LH 或者查看官方说明
Note:
执行过程中会出现:
CMake Error: Problem with tar_extract_all(): Invalid argument CMake Error: Problem extracting tar: /usr/local/src/mysql-5.6.12/source_downloads/gmock-1.6.0.zip
解决方法:
cd mysql目录下面会发现有一个source_downloads目录,需要解压unzip gmock-1.6.0.zip,然后再重新执行上述配置过程。当然你也可以去掉-DENABLE_DOWNLOADS=1这个选项,不编译谷歌的测试包也没有什么问题,但是之前的某些版本会出现无法编译的问题。
编译安装
# make && make install
建立链接文件,方便以后使用和升级:
# ln -s /usr/local/server/mysql-5.6.12 /usr/local/server/mysql
设置权限:
# chown -R mysql:mysql /usr/local/server/mysql # chown -R mysql:mysql /usr/local/server/mysql-5.6.12 # chown -R mysql:mysql /data/mysql # chown -R mysql:mysql /data/logs/mysql
初始化数据库
代码如下:
# /usr/local/server/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql --basedir=/usr/local/server/mysql --collation-server=utf8_general_ci
这时候会出现以下警告,下面配置my.cnf会解决这个问题
详情请查看 MySQL 5.6 中 TIMESTAMP 的变化
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
配置启动项目:
# cp /usr/local/server/mysql/support-files/mysql.server /etc/init.d/mysql
修改安装目录下my.cnf,部分参数需要结合实际情况进行修改
[mysqld] datadir = /data/mysql socket = /tmp/mysql.sock pid-file = /data/logs/mysql/mysql.pid user = mysql port = 3306 default_storage_engine = InnoDB # InnoDB #innodb_buffer_pool_size = 128M #innodb_log_file_size = 48M innodb_file_per_table = 1 innodb_flush_method = O_DIRECT # MyISAM #key_buffer_size = 48M # character-set character-set-server=utf8 collation-server=utf8_general_ci # name-resolve skip-host-cache skip-name-resolve # LOG log_error = /data/logs/mysql/mysql-error.log long_query_time = 1 slow-query-log slow_query_log_file = /data/logs/mysql/mysql-slow.log # Others explicit_defaults_for_timestamp=true #max_connections = 500 open_files_limit = 65535 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [client] socket = /tmp/mysql.sock port = 3306 Note:
被注释掉的部分语句,需要结合业务和硬件资源进行修改,所以先占位,使用默认值即可。my.cnf文件中不能出现拼写错误,否则,接下来启动会出现很多意想不到的错误,如果出现无法启动请参看:mysql-error.log文件。权限设置不当也会导致启动失败。
启动前,再次确认一遍权限:
很有可能现在my.cnf的权限不是mysql,同时检查一下/etc/my.cnf是否存在,如果存在则删除!!!
# chown -R mysql:mysql /usr/local/server/mysql-5.6.12
启动mysql:
# service mysql start
添加环境变量
#echo 'export PATH=$PATH:/usr/local/server/mysql/bin'>> /etc/profile
安全设置(设定初始密码,移除匿名用户,移除测试数据库):
# /usr/local/server/mysql/bin/mysql_secure_installation
添加开机启动
CentOS:
# chkconfig mysql on
Ubuntu:
# sudo update-rc.d mysql defaults
配置须知:
MySQL有大量可以修改的配置选项,通常只需要把基本的项配置正确,应该将更多的时间花在schema的优化、索引上,以及查询设计上。正确地配置MySQL的基本配置项后,再花力气去修改其他配置选项的收益通常就比较小了。
过度优化的服务器导致的潜在风险很大,容易频繁崩溃、运行缓慢。
MySQL大多数默认配置选项已经是最佳配置了,所以最好不要做太多的改动,上文设置的参数对于大多数人已经够多了。
没有一劳永逸的配置,随着数据库内数据、用户数量的变化,过一段时间后,可以有选择地调整数据库的配置。
基本配置选项详解:
socket = /tmp/mysql.sock pid_file = /data/logs/mysql/mysql.pid
socket和pid_file 文件如果不指定位置,放在默认编译位置,在不同的MySQL版本里可能会导致一些错误
default_storage_engine = InnoDB
设定默认存储引擎,创建表的时候最好显式进行存储引擎的配置
innodb_buffer_pool_size = 2G innodb_log_file_size = 128M innodb_file_per_table = 1 innodb_flush_method = 0_DIRECT
InnoDB最重要的两个选项为缓冲池大小
innodb_buffer_pool_size和 日志文件大小innodb_log_file_size,默认值一般都太小。
如果大部分表都是InnoDB表,InnoDB缓冲池的设置或许比其他任何东西都需要内存。InnoDB并不仅仅缓存索引:它还会缓存数据、自适应哈系索引、插入缓冲(Insert Buffer)、锁,以及其他内部数据结构。InnoDB还使用缓冲池来帮助延迟写入,合并多个写入操作,一起顺序写回。总之,InnoDB严重依赖缓冲池,必须分配足够内存。
Note:
缓冲池越大,预热和关闭都需要很长时间。
InnoDB使用日志来减少事务提交的开销。因为日志已经记录了事务,就无须在每个事务提交时把缓冲池的胀快刷新到磁盘中。InnoDB用日志把随机I/O变成顺序I/O。一旦日志安全写到磁盘,事务就持久化了。如果断电,InnoDB可以重放日志并且恢复已经提交的事务。
整体日志大小受控于innodb_log_file_size和innodb_log_file_in_group两个参数之乘积。一般需要设置几百MB甚至上GB。作为经验法则,一般日志文件全部大小,应该足够容纳服务器一小时的活动内容。
缓冲池大小设置方法:
从服务器总内存开始
减去操作系统占用内存和其他服务占用内存(如果还有其他服务的话)
减去MySQL自身需要内存,例如为每个查询操作分配一些缓冲。
减去足够让操作系统缓存InnoDB日志文件的内存,至少是足够缓存最近经常访问的部分。再减去一些可以缓存二进制日志的最后一部分,以防止复制产生了延迟,备库可能读取主库上旧的二进制日志文件,给主库内存造成压力。
减去其他MySQL缓冲和缓存需要的内存,如MyISAM键缓存(key_buffer_size),或者查询缓存(query cache)
处以105%,向下取舍一个合理值。
Note:设置不需要很精确,而且宁可谨慎,而不要设置过大,如果设置少了20%可能只产生很小的影响,但是如果大了20%则可能造成很严重的问题:内存交换、磁盘抖动、内存耗尽和死机。
#MyISAM key_buffer_size = 128M
MyISAM自身只缓存索引,不缓存数据(依赖操作系统缓存数据)。如果大部分为MyISAM表,就应该分配较大key_buffer_size。
再分配多大内存前,首先了解一下,MyISAM占用了多大的空间,肯定不需要分配比需要缓存的索引数据还大的内存(有时候为数据量扩增预留一些,会设置比较大)。
有两个方法计算索引大小:
使用SQL语句,查询INFORMATION——SCHEMA表的INDEX_LENGTH字段,把他们相加即可。
SELECT SUM( INDEX_LENGTH) FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE='MYISAM';
使用的UNIX系统,则使用以下命令
# du -sch `find /mysqldatadir -name “*.MYI”`
键缓存需要存储多大的值?
不要超过索引总大小,也不要超过为操作系统缓存保留的总大小。取两者较小值。
缓冲区使用率计算,通过SHOW STATUS和SHOW VARIABLES命令查看以下变量:
100 - ( ( Key_blocks_unused * key_cache_block_size) * 100 / key_buffer_size )
如果服务器运行很长一段时间之后,还是没有使用完所有缓冲键,就可以把缓冲键调小一点。
键缓冲命中率
从经验上来讲,每秒未命中次数更有用,假定一个磁盘每秒可以产生100个随机读,每秒5次缓存未命中则不会导致I/O繁忙,每秒80次则可能导致I/O繁忙。计算公式:
Key_reads / Uptime
设定默认字符集和编码
# character-set-server character-set-server=utf8 collation-server=utf8_general_ci
以下选项设定仅使用IP来链接MySQL服务器,省略了DNS查询时间
阅读材料:http://dev.mysql.com/doc/refman/5.6/en/host-cache.html
# name-resolve skip-name-resolve skip-host-cache
设定错误日志和慢查询日志。大于1s的为慢查询
# LOG log_error = /data/logs/mysql/mysql-error.log long_query_time = 1 slow_query_log slow_query_log_file = /data/logs/mysql/mysql-slow.log # Others #timestamp默认设置,5.6.6后不设置会报错 explicit_defaults_for_timestamp=true
设定同时处理的最大链接,保证应用激增产生而不堪重负,当查询不能执行,那打开一个链接没有任何好处,所以被“太多链接”的错误拒绝是一个快速而代价下的失败方式。具体设定需要参考预想的最大并发数和本机配置。
max_connections = 500
table_open_cache was known as table_cache in MySQL 5.1.2 and earlier.
table_open_cache应该设置足够大,避免总是重新打开和解析表定义。如果Open_tables的值每秒变化很大,那么table_open_cache可能设置偏小。这个值从max_connections的10倍开始设置比较好,但是,大部分情况下不要超过10000.
table_open_cache = 5000
如果在段时间内不断有错误链接,比如:权限错误,应用配置出错等。客户端达到max_connect_errors设定次数,就会被加入黑名单,无法连接,直到再次刷新主机缓存。(如何操作?)可以有效防止暴力破解密码。
max_connect_errors = 2000
在典型的Linux系统上我们把open_files_limit设置的尽可能大。现代操作系统中打开文件句柄开销都较小。如果这个参数设置不够大,会出现经典的24号错误:”too many open files”。
open_files_limit = 65535

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

MySQL 數據庫中,用戶和數據庫的關係通過權限和表定義。用戶擁有用戶名和密碼,用於訪問數據庫。權限通過 GRANT 命令授予,而表由 CREATE TABLE 命令創建。要建立用戶和數據庫之間的關係,需創建數據庫、創建用戶,然後授予權限。

數據集成簡化:AmazonRDSMySQL與Redshift的零ETL集成高效的數據集成是數據驅動型組織的核心。傳統的ETL(提取、轉換、加載)流程複雜且耗時,尤其是在將數據庫(例如AmazonRDSMySQL)與數據倉庫(例如Redshift)集成時。然而,AWS提供的零ETL集成方案徹底改變了這一現狀,為從RDSMySQL到Redshift的數據遷移提供了簡化、近乎實時的解決方案。本文將深入探討RDSMySQL零ETL與Redshift集成,闡述其工作原理以及為數據工程師和開發者帶來的優勢。

要填寫 MySQL 用戶名和密碼,請:1. 確定用戶名和密碼;2. 連接到數據庫;3. 使用用戶名和密碼執行查詢和命令。

1.使用正確的索引索引通過減少掃描的數據量來加速數據檢索select*fromemployeeswherelast_name='smith';如果多次查詢表的某一列,則為該列創建索引如果您或您的應用根據條件需要來自多個列的數據,則創建複合索引2.避免選擇*僅選擇那些需要的列,如果您選擇所有不需要的列,這只會消耗更多的服務器內存並導致服務器在高負載或頻率時間下變慢例如,您的表包含諸如created_at和updated_at以及時間戳之類的列,然後避免選擇*,因為它們在正常情況下不需要低效查詢se

MySQL 中的複制粘貼包含以下步驟:選擇數據,使用 Ctrl C(Windows)或 Cmd C(Mac)複製;在目標位置右鍵單擊,選擇“粘貼”或使用 Ctrl V(Windows)或 Cmd V(Mac);複製的數據將插入到目標位置,或替換現有數據(取決於目標位置是否已存在數據)。

通過以下命令查看 MySQL 數據庫:連接到服務器:mysql -u 用戶名 -p 密碼運行 SHOW DATABASES; 命令獲取所有現有數據庫選擇數據庫:USE 數據庫名;查看表:SHOW TABLES;查看表結構:DESCRIBE 表名;查看數據:SELECT * FROM 表名;

SQLLIMIT子句:控制查詢結果行數SQL中的LIMIT子句用於限制查詢返回的行數,這在處理大型數據集、分頁顯示和測試數據時非常有用,能有效提升查詢效率。語法基本語法:SELECTcolumn1,column2,...FROMtable_nameLIMITnumber_of_rows;number_of_rows:指定返回的行數。帶偏移量的語法:SELECTcolumn1,column2,...FROMtable_nameLIMIToffset,number_of_rows;offset:跳過

Navicat本身不存儲數據庫密碼,只能找回加密後的密碼。解決辦法:1. 檢查密碼管理器;2. 檢查Navicat的“記住密碼”功能;3. 重置數據庫密碼;4. 聯繫數據庫管理員。
