DBA学习

第一周学习笔记

目录
第一周学习笔记 1
安装mysql 3
linux系统安装mysql 3
Windows安装mysql 4
mysql参数,my.cnf/my.ini 6
熟悉DBA组wiki 13
Mysql整体架构分层 13

安装mysql
linux系统安装mysql
centos7-x64通用二进制包安装
https://blog.csdn.net/IsJiangWei/article/details/82875118#44_mariadb_79

  1. 环境准备
    2.下载mysql安装包
    3.将文件放到虚拟机内
    3.1 新建目录mysql并将文件上传至虚拟机
    3.2 解压至mysql目录
    3.2.1 切换至mysql目录并解压:
    3.2.2 解压成功,删除二进制文件:
    3.2.3 将mysql-5.7.23-linux-glibc2.12-x86_64目录下面的文件移动到mysql目录下:
    4 初始化环境并配置文件
    4.1 创建data文件夹
    4.2 下载依赖:
    4.3 创建用户组和用户并授权:
    4.4 卸载mariadb
    4.5 修改my.cnf
    4.6 将mysql放入系统服务,并修改对应文件
    4.7 初始化mysql
    5 启动mysql,修改root密码并设置远程连接
    5.1 启动mysql
    5.2 修改密码
    5.21 登陆mysql并输入4.7初始化时打印的密码:
    5.22 修改root密码
    5.23 设置root允许远程连接
    6 mysql加入环境变量并设置mysql为自启服务
    6.1 加入环境变量
    6.2 设置mysql为自启服务
    7 安装完成

Centos7-x64源码安装
https://www.cnblogs.com/liqing1009/p/7879945.html
1,解决依赖包并下载源码包到/home/soft目录下
2.新建mysql用户和用户组,创建/data/mysql目录存放mysql数据
3.预编译及编译安装
编译参数
Cmake/
DCMAKE_INSTALL_PREFIX=/usr/local/mysql:安装路径
DMYSQL_DATADIR=/data/mysql:数据文件存放位置
DSYSCONFDIR=/etc:my.cnf路径
DWITH_MYISAM_STORAGE_ENGINE=1:支持MyIASM引擎
DWITH_INNOBASE_STORAGE_ENGINE=1:支持InnoDB引擎
DMYSQL_UNIX_ADDR=/data/mysql/mysqld.sock:连接数据库socket路径
DMYSQL_TCP_PORT=3306:端口
DENABLED_LOCAL_INFILE=1:允许从本地导入数据
DWITH_PARTITION_STORAGE_ENGINE=1:安装支持数据库分区
DEXTRA_CHARSETS=all:安装所有的字符集
DDEFAULT_CHARSET=utf8:默认字符
DWITH_EMBEDDED_SERVER=1:嵌入式服务器
4设置启动脚本,开机自启动
5.拷贝my.cnf到/etc/目录下,并初始化数据库
6.启动服务
7.root管理员修改mysql密码

Windows安装mysql
Windows源码安装
https://www.jianshu.com/p/9f0d7d2a015f

  1. 下载解压mysql源码包
  2. 新建配置文件my.ini,文件路径新建data文件夹
  3. 初始化,mysqld –initialize-insecure
  4. 安装,mysqld -install
  5. 启动mysql服务 net start mysql
    Windows二进制包安装
    1)mysql5.7二进制软件下载
    下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads
    下载软件:mysql-5.7.25-win64.zip

2)解压软件到指定目录
d:\mysql-5.7.25

3)配置环境变量及path
环境变量名:MYSQL_HOME
path添加:path=%path%;%MYSQL_HOME%\bin

4)编辑my.ini参数文件(添加如下变量)并保存至%MYSQL_HOME%\bin
[mysql]
default-character-set=utf8
[mysqld]
port=3306
basedir=d:\mysql-5.7.25
datadir=d:\mysql-5.7.25\data

MySQL的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。可以过’conn%'通配符查看当前状态的连接数量,以定夺该值的大小

max_connections=200

character-set-server=utf8
default-storage-engine=innodb

5)打开命令窗口并安装mysql
d:> cd d:\mysql-5.7.25\bin
d:> mysqld install
–注:如果报错关于MSVCR120.dll及MSVCP120.dll,则c:\windows\system2下缺少这两个文件,需要从其他类似系统上拷贝该两个文件到c:\windows\system2目录下,然后,再次运行mysqld install进行安装。

6)初始化数据库
d:> cd d:\mysql-5.7.25\bin
d:> mkdir …\data
d:> mysqld --initialize --user=mysql --console
–注:如报错说数据目录非空,则将data目录情况再试,并记下屏幕显示的root密码。

7)启动连接mysql并修改root密码
d:> net start mysql
d:> mysql -u root -ppassword
mysql> alter user root@‘localhost’ identified by ‘new_password’;
mysql> flush privileges;
mysql> exit;

mysql参数,my.cnf/my.ini
性能调优,15个重要变量https://www.centos.bz/2016/11/mysql-performance-tuning-15-config-item/
[mysql]
socket = /usr/data/mysql3308/mysql.sock
default-character-set = utf8mb4
prompt = "\u@\h \R:\m:\s [\d]> "
#no-auto-rehash
auto-rehash

[client]
default-character-set=utf8
socket=/usr/data/mysql3308/mysql.sock

[mysqld]
#skip-grant-tables
server-id = 10
port = 3308
#extra_port = 4308
#extra_max_connections = 6
log-bin = mysql-bin
log_error = /usr/data/mysql3308/error.log
datadir = /usr/data/mysql3308/
basedir = /usr/local/mysql-s/
tmpdir = /usr/data/mysql3308/
slave-load-tmpdir = /usr/data/mysql3308/
socket = /usr/data/mysql3308/mysql.sock
pid-file = /usr/data/mysql3308/mysql.pid
character-set-server = utf8mb4

#slave-skip-errors = 1062
#innodb undo
#回滚日志
innodb_undo_logs = 128
innodb_undo_directory = /usr/data/mysql3308/
innodb_undo_tablespaces = 16
innodb_data_home_dir = /usr/data/mysql3308/
innodb_data_file_path = ibdata1:1024M:autoextend
innodb_log_group_home_dir = /usr/data/mysql3308/
innodb_log_files_in_group = 3
#缓冲区大小
innodb_buffer_pool_size = 128M

#事务隔离级别-读已提交解决读脏数据问题//https://blog.csdn.net/oyw5201314ck/article/details/79621954
transaction-isolation = READ-COMMITTED

innodb_log_file_size = 256M
innodb_log_buffer_size = 128M
innodb_online_alter_log_max_size = 512M
#innodb_additional_mem_pool_size = 48M
#刷新磁盘参数,
#0:log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。
#1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去,该模式为系统默认。
#2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。
设为1当然是最安全的,但性能页是最差的(相对其他两个参数而言,但不是不能接受)。如果对数据一致性和完整性要求不高,完全可以设为2,如果只最求性能,例如高并发写的日志服务器,设为0来获得更高性能
innodb_flush_log_at_trx_commit = 1
#使用独立表空间,动态参数,(5.6默认OFF,5.7默认ON)
innodb_file_per_table = 1
#事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败;参数的时间单位是秒,最小可设置为1s(此时需要考虑应用端的频繁异常处理会消耗性能,不能设置过小),最大可设置1073741824秒以上
innodb_lock_wait_timeout = 20
#innodb_buffer_pool_instances可以开启多个内存缓冲池,把需要缓冲的数据hash到不同的缓冲池中,这样可以并行的内存读写。
innodb_buffer_pool_instances = 16
#O_DIRECT模式:数据文件的写入操作是直接从mysql innodb buffer到磁盘的,并不用通过操作系统的缓冲,而真正的完成也是在flush这步,日志还是要经过OS缓冲
#https://blog.csdn.net/smooth00/article/details/72725941
innodb_flush_method = O_DIRECT
#innodb_adaptive_hash_index_partitions = 4
#充分利用cpu能力,当前两颗8核,读与写均衡
innodb_read_io_threads = 8
sql_mode = “NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO”
innodb_write_io_threads = 8

#提高tps
innodb_io_capacity = 1000
#最大脏页的百分数,当系统中 脏页 所占百分比超过这个值,INNODB就会进行写操作以把页中的已更新数据写入到磁盘文件中。
innodb_max_dirty_pages_pct = 75
#自旋锁的轮转数,可以通过show engine innodb status来查看。相较于系统等待,自旋锁是低成本的等待;不过它是一个活跃的等待,会浪费一些cpu资源。因此如果看到大量的自旋等待和自旋轮转,则很显然它浪费了很多cpu资源。浪费cpu时间和无谓的上下文切换之间可以通过该值来平衡。
innodb_sync_spin_loops = 10
#在关闭时把热数据dump到本地磁盘。
innodb_buffer_pool_dump_at_shutdown = ON
#在启动时把热数据加载到内存。
innodb_buffer_pool_load_at_startup = ON
#是否自动更新统计信息,默认为关闭状态。
innodb_stats_on_metadata = OFF
#保存死锁日志
innodb_print_all_deadlocks = ON

#thread_handling = pool-of-threads #开启线程池
#thread_pool_oversubscribe = 8
#是否自动清空不再需要的中继日志
relay_log_purge = 1

#expand_fast_index_creation = 1
#指出在mysql暂时停止回答新请求者前的短时间内多少请求可以被存在堆栈中
#https://www.cnblogs.com/mydriverc/p/8296814.html
back_log = 100
#服务器响应的最大连接
max_connections = 4096
#与访问安全有关的参数
max_connect_errors = 999999999

这个值(默认8)表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,

如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,

增加这个值可以改善系统性能.通过比较Connections和Threads_created状态的变量,可以看到这个变量的作用。(–>表示要调整的值)

根据物理内存设置规则如下:

1G —> 8

2G —> 16

3G —> 32

大于3G —> 64

thread_cache_size = 128
#制定表高速缓存大小,每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。

MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值64

假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);

当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上

table_open_cache = 4096
#服务器关闭交互式连接前等待活动的秒速】数。默认28800s.
interactive_timeout = 3600

#服务器关闭非交互连接之前等待活动的秒数。在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,

取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。参数默认值:28800秒(8小时)

MySQL服务器所支持的最大连接数是有上限的,因为每个连接的建立都会消耗内存,因此我们希望客户端在连接到MySQL Server处理完相应的操作后,

应该断开连接并释放占用的内存。如果你的MySQL Server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,

最终肯定会达到MySQL Server的连接上限数,这会报’too many connections’的错误。对于wait_timeout的值设定,应该根据系统的运行情况来判断。

在系统运行一段时间后,可以通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大,

可以进行适当的调整小些。要同时设置interactive_timeout和wait_timeout才会生效。

wait_timeout = 3600

MySQL执行排序使用的缓冲大小。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。

如果不能,可以尝试增加sort_buffer_size变量的大小

sort_buffer_size = 4M

联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享

join_buffer_size = 2M

MySQL的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,

MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySQL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大

read_rnd_buffer_size = 24M

group_concat_max_len = 64K

MyISAM设置恢复表之时使用的缓冲区的尺寸,当在REPAIR TABLE或用CREATE INDEX创建索引或ALTER TABLE过程中排序 MyISAM索引分配的缓冲区

myisam_sort_buffer_size = 64M
#用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写)。
key_buffer_size = 512M
#MySQL的查询缓冲大小(从4.0.1开始,MySQL提供了查询缓冲机制)使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中,

今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。

通过检查状态值’Qcache_%’,可以知道query_cache_size设置是否合理:如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,

如果Qcache_hits的值也非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小;如果Qcache_hits的值不大,则表明你的查询重复率很低,

这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲

query_cache_size = 0
query_cache_type = 0
#如果动态页面要调大点,100M以上,如果网站大部分都是静态内容,一般64M足够。
max_tmp_tables = 64

MySQL的heap(堆积)表缓冲大小。所有联合在一个DML指令内完成,并且大多数联合甚至可以不用临时表即可以完成。

大多数临时表是基于内存的(HEAP)表。具有大的记录长度的临时表 (所有列的长度的和)或包含BLOB列的表存储在硬盘上。

如果某个内部heap(堆积)表大小超过tmp_table_size,MySQL可以根据需要自动将内存中的heap表改为基于硬盘的MyISAM表。还可以通过设置tmp_table_size选项来增加临时表的大小。也就是说,如果调高该值,MySQL同时将增加heap表的大小,可达到提高联接查询速度的效果

tmp_table_size = 128M

定义了用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变

max_heap_table_size = 128M

read_only = 0
expire_logs_days = 14

接受的数据包大小;增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或MySQLd必须返回大的结果行时MySQLd才会分配更多内存。

该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。

max_allowed_packet = 64M
#跳过外部锁定
skip-external-locking
#禁用dns解析
skip-name-resolve
#让mysql不区分大小写
lower_case_table_names = 1
#慢查询优化
slow_query_log = 1
long_query_time = 1
slow_query_log_file = slow.log
#log_queries_not_using_indexes = ON
#log_throttle_queries_not_using_indexes = 1

#控制数据库的binlog刷到磁盘
sync_binlog = 1
log-bin = mysql-bin
relay-log = relay-bin

#binlog参数设置

一个事务,在没有提交的时候,产生的日志,记录到Cache中;等到事务提交需要提交的时候,则把日志持久化到磁盘。默认binlog_cache_size大小32K

binlog_cache_size = 1M
#让从库从主库复制数据时可以写入到binlog日志
log-slave-updates = ON
#防止复制随着mysql启动而自动启动
skip-slave-start
replicate-same-server-id = 0
relay_log_recovery = 1

#delay_key_write = ALL

用于IO_thread对主库binlog的过滤

myisam_repair_threads = 1
myisam-recover-options = BACKUP

binlog_gtid_simple_recovery = 1

#MGR
plugin_load = group_replication.so
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = “2306cc6a-4ab7-11e9-abcf-fa163e37a4ca”
loose-group_replication_ip_whitelist = “10.0.0.0/8”
#loose-group_replication_single_primary_mode = off
#loose-group_replication_enforce_update_everywhere_checks = on
loose-group_replication_start_on_boot = off
loose-group_replication_bootstrap_group = off
report_host = 10.104.113.250
loose-group_replication_local_address = “10.104.113.250:17300”
loose-group_replication_group_seeds = “10.104.113.250:17300,10.104.116.45:17300,10.104.116.46:17300”
slave_preserve_commit_order = on

#GTID
gtid_mode = ON
enforce_gtid_consistency = ON
#group_replication_auto_increment_increment = 1
auto_increment_increment = 1
master_info_repository = TABLE
relay_log_info_repository = TABLE
log_slave_updates = ON
binlog_format = ROW
binlog_checksum = NONE
log_error_verbosity = 2
log_timestamps = SYSTEM
default_password_lifetime = 0
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 8
innodb_buffer_pool_dump_pct = 40
innodb_page_cleaners = 4
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 2G
innodb_purge_rseg_truncate_frequency = 128
show_compatibility_56 = on
#innodb monitor 监控
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”
performance_schema_instrument = “memory%=counted”
performance-schema-instrument = ‘wait/lock/metadata/sql/mdl=ON’

熟悉DBA组wiki
Ambari
Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的供应、管理和监控。Ambari已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeeper、Sqoop和Hcatalog等。
Greenplum分布式数据库
https://www.cnblogs.com/arthurqin/p/6243277.html

在 GPDB 推荐的硬件配置环境下,每个有效的 CPU 核对应一个 Segment ,比如一台物理主机配备了2个双核的 CPU,那么每个主机配置4个主实例( Segment Primary )。
InfluxDB时序数据库
https://blog.csdn.net/liuyueyi25/article/details/81252717
这个对比的是mysql中的record,在influxDB中,表示每个表中,某个时刻,满足某个条件的filed数据(简单来说就是 timestamp + tag + filed)的组成一个point

timestamp : 时间戳,ns单位,每个记录都必然有这个属性,没有显示添加时,默认给一个
tag: 标签,kv结构,在database中, tag + measurement 一起构建索引
参与索引创建,因此适合作为查询的过滤条件
tag的数据量不要太多,最好能有典型的辨别性(和mysql的建立索引的原则差不多)
value为String类型
tag是可选的,在measurement不设置tag也是ok的
field:存储数据,kv结构
数据类型为: long, String, boolean, float
MongoDB文档数据库
https://baijiahao.baidu.com/s?id=1628046484646131840&wfr=spider&for=pc
MongoDB是一种非关系型数据库,一般称作No SQL(Not only SQL),是为了摆脱关系型数据库的约束而出现的文档数据库。
MongoDB是为了快速开发互联网Web应用而设计的数据库系统。
MongoDB的设计目标是极简、灵活,作为Web应用栈的一部分。
MongoDB的数据模型是面向文档的,所谓文档是一种类似JSON的结构,可以简单理解MongoDB这个数据库中存放的是各种各样的JSON,在MongoDB中称之为“BSON”。
一、3个概念
1、数据库 database,它是一个仓库,在仓库中可以存放集合。
2、集合 collection,类似于数组,在集合中可以存放文档。
3、文档 document,文档是数据库中的最小单位,我们存储和操作的内容都是文档。
二、MongoDB的版本说明
1、偶数版本为稳定版本(如3.4),奇数版本是开发版本(如3.3)。
2、MongoDB对于32位操作系统的支持不是很好,所以3.2版本之后不再提供对32位操作系统的支持。

MySQL数据库
oracle数据库
https://baike.baidu.com/item/Oracle%E6%95%B0%E6%8D%AE%E5%BA%93/3710800?fr=aladdin

数据段:用来存放表数据;
索引段:用来存放表索引;
临时段:用来存放中间结果;
回滚段:用于出现异常时,恢复事务。

PostgreSQL数据库
https://baijiahao.baidu.com/s?id=1596594552855041877&wfr=spider&for=pc
SAP HANA内存数据库

SQLServer数据库
https://baike.baidu.com/item/SQLserver%E6%95%B0%E6%8D%AE%E5%BA%93/8979184?fr=aladdin
Tidb 分布式数据库
https://blog.csdn.net/sdmxdzb/article/details/81461777

Mysql整体架构分层
https://www.cnblogs.com/wzj4858/p/7910340.html
《高性能mysql第三版》

每个虚线框都是一层:
第一层:最上层的服务器不是MySql所独有的,大多数基于网络的客户端/服务器工具或者服务都有类似的系统。比如链接处理,授权认证,安全等等。
第二层:大多数的MySql的核心服务功能都在这一层,包括查询解析、分析、优化、缓存以及所有的内置函数(例如:日期,时间,数学和加密函数等)。所有跨存储引擎的功能都在这一层实现:存储过程,触发器,视图。
第三层:包含了存储引擎。存储引擎负责MySql中的数据存储和提取。服务器通过API和存储引擎进行通信,这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。存储引擎API包含了几十个底层函数,用于执行诸如”开始一个事务“或者”根据主键提取一行记录“等操作。但存储引擎不会去解析SQL(InnoDB是一个例外,它会解析外键定义,因为MySQL服务器本身没有实现该功能)

二、连接管理和安全性
每个客户端连接都会在服务器进程中拥有一个线程,这个链接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者CPU中运行。服务器会负责缓存线程,因此不需要为每一个新建的创建或者销毁线程。
当客户端(应用)连接到MySQL服务器时,服务器需要对其进行认证。认证基于用户名,原始主机信息和密码。如果使用了安全套接字(SSL)的方式连接,还可以使用X.509整数认证。一旦客户端连接成功,服务器会继续验证该客户端是否具有执行某个特定查询的权限。
三、优化与执行
MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询,决定表的读取顺序,以及选择合适的索引等。用户可以通过特殊的关键字提示(hint)优化器,影响他的决策过程。也可以请求优化器解释(explain)优化过程的各个因素,使用户可以知道服务器是如何进行优化决策的,并提供一个参考基准,便于用户重构查询和schema(对于MySQL下的schema,可以理解成就是存储数据的地方)、修改相关配置,使应用尽可能高效运行。
优化器并不关心表使用的是什么存储引擎,但存储引擎对于优化查询是有影响的。优化器会起请求存储引擎提供容量或某个具体操作的开销信息,以及表数据的统计信息等。
对于SELECT语句,在解析查询之前,服务器会先检查缓存(Query cache),如果能够在其中找到对应的查询,服务器就不必在执行查询解析、优化和执行的整个过程,而是直接返回查询缓存中的结果集。
四、并发控制
分为服务器层控制和存储引擎层控制两方面。都是使用读写锁来控制。
锁分为表锁和行级锁。
服务器层使用表级锁来同步,行级锁只存在于存储引擎层面

Mysql日志文件
https://www.cnblogs.com/wangkongming/p/3684950.html
错误日志(/var/lib/mysql/error.log)
错误日志
在mysql数据库中,错误日志功能是默认开启的。并且,错误日志无法被禁止。默认情况下,错误日志存储在mysql数据库的数据文件中。错误日志文件通常的名称为hostname.err。其中,hostname表示服务器主机名。
错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-err是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。默认情况下错误日志大概记录以下几个方面的信息:服务器启动和关闭过程中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等)、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息。

查询日志(general_log_file=general_log.log
general_log=on)
查询日志:
默认情况下查询日志是关闭的。由于查询日志会记录用户的所有操作,其中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,会影响mysql的性能的。如若不是为了调试数据库的目的建议不要开启查询日志。

慢查询日志(slow_query_log_file = slow.log)
慢查询日志是用来记录执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的查询语句。可以帮助我们定位性能问题的。
启动和设置慢查询日志:
1、通过配置文件my.cnf中的log-slow-queries选项可以开启慢查询日志;形式如下:

1
2
3
4 [root@stu18 data]# vim /etc/my.cnf
[mysqld]
slow_query_log=1
log-slow-queries [= DIR/[filename] ]
其中,DIR参数指定慢查询日志的存储路径;filename参数指定日志的文件名,生成日志文件的完成名称为filename-slow.log。如果不指定存储路径,慢查询日志默认存储到mysql数据库的数据文件下,如果不指定文件名,默认文件名为hostname-slow.log。
2、通过登录mysql服务器直接定义,方式如下:
首先要有全局权限;然后执行mysql>set global slow_query_log=1;
时间默认超过多少的称为慢查询日志?
一般都是通过long_query_time选项来设置这个时间值,时间以秒为单位,可以精确到微秒。如果查询时间超过了这个时间值(默认为10秒),这个查询语句将被记录到慢查询日志中。查看服务器默认时间值方式如下:

1
2
3
4
5
6
7 mysql> SHOW GLOBAL VARIABLES LIKE ‘long%’;
±----------------±----------+
| Variable_name | Value |
±----------------±----------+
| long_query_time | 10.000000 |
±----------------±----------+
1 row in set (0.04 sec)
注释:其中这个慢查询时间并不是只表示语句自身执行超过10秒还包含由于其他资源被征用造成阻塞的查询执行时间或其他原因等都被记录到慢查询中。所以这个慢查的时长表示从查询开始到查询结束中间包含可能的任何原因所经历的所有时间。

事务日志(innodb_undo_directory = /var/lib/mysql/)
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)的缩写,这四种状态的意思是:
1、原子性
即不可分割,事务要么全部被执行,要么全部不执行。如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生变化;如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换
2、一致性
事务的执行使得数据库从一种正确状态转换成另外一种正确状态
3、隔离性
在事务正确提交之前,不允许把事务对该数据的改变提供给任何其他事务,即在事务正确提交之前,它可能的结果不应该显示给其他事务
4、持久性
事务正确提交之后,其结果将永远保存在数据库之中,即使在事务提交之后有了其他故障,事务的处理结果也会得到保存
什么是事务日志
事务要保证ACID的完整性必须依靠事务日志做跟踪,每一个操作在真正写入数据数据库之前,先写入到日志文件中
如要删除一行数据会先在日志文件中将此行标记为删除,但是数据库中的数据文件并没有发生变化.
只有在(包含多个sql语句)整个事务提交后,再把整个事务中的sql语句批量同步到磁盘上的数据库文件
在事务引擎上的每一次写操作都需要执行两遍:
1.先写入日志文件中
写入日志文件中的仅仅是操作过程,而不是操作数据本身,所以速度比写数据库文件速度要快很多.
2.然后再写入数据库文件中
写入数据库文件的操作是重做事务日志中已提交的事务操作的记录.
日志组
一般不止设置一个日志文件,一个文件写满之后使用另外一个日志文件提高服务器效率.
日志文件的日志同步到磁盘后空间会自动释放,单个日志文件不宜设置过大 如果日志文件过大mysql进程在把日志同步到数据文件的时候可能会崩溃
事务日志用途
事务日志可以帮助提高事务的效率,使用事务日志,存储引擎在修改表的数据的时候只需要修改其内存拷贝,再把该行为记录到持久在磁盘的事务日志中.而不用每次都将修改的数据本身持久到磁盘.事务日志采用的是追加方式,因此写日志的操作是磁盘上一小块区域的顺序IO,而不像随机IO需要磁盘在多个地方移动.所以采用事务日志的方式相对来说要快的多,事务日志持久后,内存中的修改在后台慢慢的刷回磁盘.期间如果系统发生崩溃,存储引擎在重启的时候依靠事务日志自动恢复这部分被修改数据

二进制日志(log-bin = mysql-bin)
二进制日志也叫作变更日志,主要用于记录修改数据或有可能引起数据改变的mysql语句,并且记录了语句发生时间、执行时长、操作的数据等等。所以说通过二进制日志可以查询mysql数据库中进行了哪些变化。一般大小体积上限为1G。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值