MySql-体系结构以及各种文件类型_MySQL
MySql体系结构
由数据库和数据库实例组成,是单进场多线程架构。
数据库:物理操作系统文件或者其它文件的集合,数据库文件可以是frm、myd、myi、ibd等结尾的文件。当使用ndb存储引擎时候,不是os文件,是存放于内存中的文件。
数据库实例:由数据库后台进程/线程以及一个共享内存区组成,共享内存可以被运行的后台进程/线程所共享。
MySql文件类型
Mysql主要文件类型有如下几种:
参数文件:mysql实例启动的时候在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置,还介绍了参数类型以及定义作用域。
日志文件:记录mysql对某种条件做出响应时候写入的文件。
Socket文件:当用linux的mysql命令行窗口登录的时候需要的文件
Pid文件:mysql实例的进程文件
Mysql表结构文件:存放mysql表结构定义文件
存储引擎文件:记录存储引擎信息的文件。
参数文件my.cnf
Mysql实例启动时,会先读取配置参数文件my.cnf
寻找my.cnf位置
(1):默认情况: mysql–help"grep my.cnf
(2):后台进程去找:ps–eaf|grep mysql
(3):全局搜索:find /-name my.cnf
可以用vi直接维护修改里面的参数值
(1)dynamic :可以通过set进行实时修改
(2)static,只能在my.cnf里面修改,需要restart生效
Mysql参数文件中的参数可以分为2种类型:动态(dynamic)参数和静态参数(staitic)
动态参数意味着可以在mysql实例运行中进行修改,set global sort_buffer_size=32999999;修改后,别的connection重新进行连接就可以生效了。
生效范围分为:global和session。
静态的说明在整个mysql实例运行期间不得进行修改,就类似一个只读的read only
日志文件
日志文件记录了影响mysql数据库的各种类型活动,常见的日志文件有错误日志、二进制日志、慢查询日志、全查询日志、redo日志、undo日志
错误日志
错误日志对mysql的启动、运行、关闭过程进行了记录,mysql dba在遇到问题时候,第一时间应该查看这个错误日志文件,该文件不但记录了出错信息,还记录了一些警告信息以及正确信息,这个error日志文件类似于oracle的alert文件,只不过默认情况下是以error结尾。可以通过show variables like ‘log_error’;
错误文件的文件名为服务器的主机名。当然也可以在my.cnf里面设置错误日志文件的路径:
<code class="hljs applescript">Vim my.cnf log-error=/usr/local/mysql/mysqld.log</code>
我们可以在错误日志文件里面看到一些数据库启动信息,以及告警信息还有就是报错信息
<strong>慢查询日志slow log</strong><br />
慢查询日志就是记录运行较慢的sql语句信息,给sql语句的优化带来很好的帮助,可以设置一个阀值,将运行时间超过该阀值的sql语句的运行信息都记录到slow log日志里面去。该阀值可以通过<strong>long_query_time</strong>来设置,也可以设置到毫秒微秒:<br />
对于运行时间等于该阀值的,就不会记录在内了。<br />
另外一个参数是<strong>log_queries_not_using_indexes</strong>,如果运行的sql没有使用索引,只要超过阀值了也会记录在慢查询日志里面的。<br />
慢查询日志还可以记录在table里面,<br />
Slow_log表,也可以将慢查询日志放入一张表里面<br />
<strong>show variables like ‘log_output’;</strong>查看如果是file就存放在slow log里面,如果是table就在slow_log表里面。
<strong>全查询日志</strong><br />
记录了对mysql数据库所有的请求信息,不论这些请求信息是否得到了正确的执行,默认文件名为主机名.log,你可以看到对access denied的请求。<br />
数据库审计+ 问题排查跟踪(损失3%-5%性能)
<strong>二进制日志</strong><br />
记录了对数据库进行变更的操作,但是不包括select操作以及show操作,因为这类操作对数据库本身没有没有修改,如果你还想记录select和show的话,你就需要查看前面的全查询日志,另外binlog还包括了执行数据库更改操作时间和执行时间等信息。
二进制的主要作用有如下2个:<br />
1.恢复 <strong>recovery</strong>。某些数据的恢复需要二进制日志,在全库文件恢复后,可以在此基础上通过二进制日志进行point-to-time的恢复。<br />
2.复制(<strong>replication</strong>)。其原理和恢复类似,通过复制和执行二进制日志使得一台远程的mysql数据库(slave)于一台mysql数据库(master)进行实时同步。<br />
通过在my.cnf里面设置log-bin =/home/data/mysql/binlog/mysql-bin.log生效,默认是在数据目录datadir下面
<strong>binlog_cache_size</strong>:<br />
使用innodb存储引擎时候,所有未提交uncommitted的二进制日志会被记录到一个缓存中,等该事务提交时committed直接将缓冲中的二进制日志写入二进制日志文件里面,而该缓冲的大小就由binlog_cache_size来决定,这个缓冲区是基于session的,也就是每一个线程需要事务的时候,mysql都会分配一个binlog_cache_size的缓存,因此改值设置需要非常小心,不能设置过大,免得内存溢出了。
<strong>sync_binlog</strong>:<br />
sync_binlog=N,大概就是表示每次写缓冲N次就同步到磁盘文件中,如果将N设置为1的话,每次都会写入binlog磁盘文件中,这是最保险最安全的,如果N>1,在意外发生的时候,就表示会有N-1个dml没有被写入binlog中,有可能就会发生主动数据不一致的情况。
<strong>binlog-do-db、binlog-ingore-db</strong>:<br />
表示需要写入或者忽略写入哪些库的日志,默认为空,表示可以将所有库的日志写入到二进制文件里面。
<strong>log-slave-update</strong>:<br />
启用从机服务器上的slave日志功能,使这台计算机可以用来构成一个镜像链(A->B->C) ,可以让从库上面产生二进制日志文件,在从库上再挂载一个从库。
<strong>binlog-format</strong>:日志格式
<strong>Statement</strong>:每一条会修改数据的sql都会记录在binlog中。<br />
优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。(相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。)<br />
缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题(如sleep()函数,last_insert_id(),以及user-definedfunctions(udf)会出现问题).
<strong>Row</strong>:不记录sql语句上下文相关信息,仅保存哪条记录被修改。<br />
优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题<br />
缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如一条update语句,修改多条记录,则binlog中每一条修改都会有记录,这样造成binlog日志量会很大,特别是当执行altertable之类的语句的时候,由于表结构修改,每条记录都发生改变,那么该表每一条记录都会记录到日志中。
<strong>Mixedlevel</strong>: 是以上两种level的混合使用,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.新版本的MySQL中队rowlevel模式也被做了优化,并不是所有的修改都会以rowlevel来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。
使用以下函数的语句也无法被复制:<br />
*LOAD_FILE()<br />
*UUID()<br />
*USER()<br />
*FOUND_ROWS()<br />
*SYSDATE() (除非启动时启用了–sysdate-is-now 选项)<br />
同时在INSERT …SELECT 会产生比 RBR 更多的行级锁
<strong>套接字socket文件</strong><br />
Linux系统下 本地连接mysql可以采用linux域套接字socket方式 ,需要一个套接字socket发文件,可以有参数socket控制,一般默认在/tmp目录下,也可以通过如下方式查看:
<code class="hljs applescript"><code class="hljs ruby">ps -eaf|grep mysql |grep socket [root@data01 binlog]# ps -eaf|grep mysql|grep socket mysql 3152 1979 0 Feb28 ? 00:00:02 /usr/local/mysql/bin/mysqld--basedir=/usr/local/mysql --datadir=/home/data/mysql/data--plugin-dir=/usr/local/mysql/lib/plugin --user=mysql--log-error=/usr/local/mysql/mysqld.log --open-files-limit=8192--pid-file=/usr/local/mysql/mysqld.pid --socket=/usr/local/mysql/mysql.sock--port=3306 [root@data01 binlog]#</code></code>
<code class="hljs applescript"><code class="hljs ruby"><code class="hljs sql">show variables like 'socket';</code></code></code>
<code class="hljs applescript"><code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby">my.cnf, socket = /usr/local/mysql/mysql.sock</code></code></code></code>
<code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><strong>pid文件</strong><br />
当mysql实例启动的时候,会将自己的进程id写入一个文件中,该文件即为pid文件,由参数pid_file控制,默认路径位于数据库目录下,可以通过以下三种方式查看:
<code class="hljs applescript"><code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql">show variableslike 'pid_file';</code></code></code></code></code>
<code class="hljs applescript"><code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk">ps -eaf|grepmysql |grep pid</code></code></code></code></code></code>
<code class="hljs applescript"><code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk"><code class="hljs ruby">My.cnf (pid-file = /usr/local/mysql/mysqld.pid)</code></code></code></code></code></code></code>
<code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk"><code class="hljs ruby"><strong>表结构文件</strong><br />
*.frm<br />
*.ibd
<code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk"><code class="hljs ruby"><strong>innodb存储文件</strong><br />
innodb存储引擎在存储设计上模仿了oracle,该文件就是默认的表空间文件,可以通过参数innodb_data_file_path来进行设置,格式如下:
<code class="hljs applescript"><code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk"><code class="hljs ruby"><code class="hljs fix">innodb_data_file_path= IBdata1:128M;IBdata2:128M:autoextend</code></code></code></code></code></code></code></code>
<code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk"><code class="hljs ruby"><code class="hljs fix">可以用多个文件组成一个表空间,同时制定文件的属性,<br />
IBdata1和IBdata2位于不同的磁盘组上,则可以对性能带来一定程度的提升。文件后面的属性表示文件大小,autoextend表示还可以扩展。<br />
但是如果设置了innodb_file_per_table为true后,那么表数据文件就会在单独的.ibd文件里面,不在这个ibdata文件里面了。
<code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk"><code class="hljs ruby"><code class="hljs fix"><strong>redo文件</strong><br />
所有的数据库都是日志先行,先写日志,再写数据文件,所以才会有redo log的规则。
<code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk"><code class="hljs ruby"><code class="hljs fix">默认情况下会有2个文件名称分别为ib_logfile0 和ib_logfile1 ,在mysql数据库目录下可以看到这2个文件,这个对innodb存储引擎非常重要,因为它们记录了对于innodb存储引擎的事务日志。
<code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk"><code class="hljs ruby"><code class="hljs fix">重做日志文件的主要目的是:万一实例或者介质失败media failure,重做日志就可以派上用场,如果数据库由于所在主机掉电导致实例失败,innodb存储引擎会使用重做日志恢复到掉电前的时刻,以此来保证数据的完整性。
<code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk"><code class="hljs ruby"><code class="hljs fix">每个innodb存储引擎至少有一个重做日志组,每组至少有2个重做日志文件,如默认的ib_logfile0 和ib_logfile1,为了得到更高的可靠性,你可以设置多个组,也可以将每组放在不同的磁盘上面,来提高性能
<code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk"><code class="hljs ruby"><code class="hljs fix">LSN logsequence number:<br />
递增产生的,可以唯一的标记一条redo日志,对于我们数据库故障恢复都是非常重要的,可以唯一定位数据库运行状态,至于如何定位细节,大家可以去看下redo、undo的源码,源码:在”storage/innobase/include/log0log.h”
<code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk"><code class="hljs ruby"><code class="hljs fix">查看参数设置:
<code class="hljs applescript"><code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk"><code class="hljs ruby"><code class="hljs fix"><code class="hljs sql">show variables like 'innodb%log%';</code></code></code></code></code></code></code></code></code>
<code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk"><code class="hljs ruby"><code class="hljs fix"><code class="hljs sql"><strong>undo日志</strong><br>
存在于共享表空间ibdata1里面,有一个回滚段地址,里面存放了头信息,配置头信息,段的头信息,里面存储了与redo相反的数据更新操作,如果rollback的话,就把undo段里面数据回写到数据文件里面。
<code class="hljs ruby"><code class="hljs sql"><code class="hljs ruby"><code class="hljs sql"><code class="hljs smalltalk"><code class="hljs ruby"><code class="hljs fix"><code class="hljs sql">如果用了独立表空间的话,则直接存储到表私自的空间中,而不存储到共享表空间中。在innodb存储引擎中,undo log用来完成事务的回滚以及MVCC的功能

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











MySQL 데이터베이스에서 사용자와 데이터베이스 간의 관계는 권한과 테이블로 정의됩니다. 사용자는 데이터베이스에 액세스 할 수있는 사용자 이름과 비밀번호가 있습니다. 권한은 보조금 명령을 통해 부여되며 테이블은 Create Table 명령에 의해 생성됩니다. 사용자와 데이터베이스 간의 관계를 설정하려면 데이터베이스를 작성하고 사용자를 생성 한 다음 권한을 부여해야합니다.

데이터 통합 단순화 : AmazonRdsMysQL 및 Redshift의 Zero ETL 통합 효율적인 데이터 통합은 데이터 중심 구성의 핵심입니다. 전통적인 ETL (추출, 변환,로드) 프로세스는 특히 데이터베이스 (예 : AmazonRDSMySQL)를 데이터웨어 하우스 (예 : Redshift)와 통합 할 때 복잡하고 시간이 많이 걸립니다. 그러나 AWS는 이러한 상황을 완전히 변경 한 Zero ETL 통합 솔루션을 제공하여 RDSMYSQL에서 Redshift로 데이터 마이그레이션을위한 단순화 된 거의 실시간 솔루션을 제공합니다. 이 기사는 RDSMYSQL ZERL ETL 통합으로 Redshift와 함께 작동하여 데이터 엔지니어 및 개발자에게 제공하는 장점과 장점을 설명합니다.

MySQL은 설치가 간단하고 강력하며 데이터를 쉽게 관리하기 쉽기 때문에 초보자에게 적합합니다. 1. 다양한 운영 체제에 적합한 간단한 설치 및 구성. 2. 데이터베이스 및 테이블 작성, 삽입, 쿼리, 업데이트 및 삭제와 같은 기본 작업을 지원합니다. 3. 조인 작업 및 하위 쿼리와 같은 고급 기능을 제공합니다. 4. 인덱싱, 쿼리 최적화 및 테이블 파티셔닝을 통해 성능을 향상시킬 수 있습니다. 5. 데이터 보안 및 일관성을 보장하기위한 지원 백업, 복구 및 보안 조치.

MySQL 사용자 이름 및 비밀번호를 작성하려면 : 1. 사용자 이름과 비밀번호를 결정합니다. 2. 데이터베이스에 연결; 3. 사용자 이름과 비밀번호를 사용하여 쿼리 및 명령을 실행하십시오.

1. 올바른 색인을 사용하여 스캔 한 데이터의 양을 줄임으로써 데이터 검색 속도를 높이십시오. 테이블 열을 여러 번 찾으면 해당 열에 대한 인덱스를 만듭니다. 귀하 또는 귀하의 앱이 기준에 따라 여러 열에서 데이터가 필요한 경우 복합 인덱스 2를 만듭니다. 2. 선택을 피하십시오 * 필요한 열만 선택하면 모든 원치 않는 열을 선택하면 더 많은 서버 메모리를 선택하면 서버가 높은 부하 또는 주파수 시간으로 서버가 속도가 느려지며, 예를 들어 Creation_at 및 Updated_at 및 Timestamps와 같은 열이 포함되어 있지 않기 때문에 쿼리가 필요하지 않기 때문에 테이블은 선택을 피할 수 없습니다.

Navicat 자체는 데이터베이스 비밀번호를 저장하지 않으며 암호화 된 암호 만 검색 할 수 있습니다. 솔루션 : 1. 비밀번호 관리자를 확인하십시오. 2. Navicat의 "비밀번호 기억"기능을 확인하십시오. 3. 데이터베이스 비밀번호를 재설정합니다. 4. 데이터베이스 관리자에게 문의하십시오.

데이터베이스 산 속성에 대한 자세한 설명 산 속성은 데이터베이스 트랜잭션의 신뢰성과 일관성을 보장하기위한 일련의 규칙입니다. 데이터베이스 시스템이 트랜잭션을 처리하는 방법을 정의하고 시스템 충돌, 전원 중단 또는 여러 사용자의 동시 액세스가 발생할 경우에도 데이터 무결성 및 정확성을 보장합니다. 산 속성 개요 원자력 : 트랜잭션은 불가분의 단위로 간주됩니다. 모든 부분이 실패하고 전체 트랜잭션이 롤백되며 데이터베이스는 변경 사항을 유지하지 않습니다. 예를 들어, 은행 송금이 한 계정에서 공제되지만 다른 계정으로 인상되지 않은 경우 전체 작업이 취소됩니다. BeginTransaction; updateAccountssetBalance = Balance-100WH

다음 명령으로 MySQL 데이터베이스를보십시오. 서버에 연결하십시오. mysql -u username -p password run show database; 기존의 모든 데이터베이스를 가져 오려는 명령 데이터베이스 선택 : 데이터베이스 이름 사용; 보기 테이블 : 테이블 표시; 테이블 구조보기 : 테이블 이름을 설명합니다. 데이터보기 : 테이블 이름에서 *를 선택하십시오.
