MySQL学习9–MySQL5.1的备份恢复

使用mysqldump工具备份
  1. mysql client is a backup program,it can be used to dump a database or a collection of databases for backup or for transferring the data to another SQL server(not necessarily a mysql server).The dump contains Sql statements to create the table or populate it, or both;
  2. 它可以导出所有的数据库,指定的一个或者几个数据库,或者一张表;
  3. mysqldump可以备份本地的或者远程的服务器,导出的文件包含CREATE TABLE和INSERT语句用于重新创建表,服务器发送表内容到mysqldump程序,它把文件写到客户端;
  4. 它可以备份各种引擎的表;
  5. 导出的文件是文本文件,所以有很强的灵活性,可以被用于在不同的服务器上;
mysqldump的参数
  1. -A,–all-databases:导出所有的数据库,跟使用–databases后面跟上所有的数据库是一样的;
  2. –add-drop-database:在创建数据库前添加drop database的语句;
  3. –add-drop-table:在创建表之前添加drop table语句;
  4. –add-locks:在插入语句前加锁;
  5. –allow-keywords:创建的列允许使用关键字;
  6. -i,–comments:写入附加信息,即添加注释;
  7. -c,–complete-insert:使用完全插入语句,个人觉得还是-e参数好,数据量小用-e,数据量大用-c;
  8. -B,–databases:备份多个数据库,把要备份的数据库跟在参数后面即可,当前数据库也会被包涵进来;
  9. –delete-master-logs:备份完成后删除主机日志,自动打开–master-data选项;
  10. -e,–extended-insert:使用multiple-row INSERT语句,即一个insert语句后面有多个值的列表,这是一种更高效的插入方式;
  11. -F,–flush-logs:开始备份前切换一下日志,如果你一次备份多个数据库(使用–databases或者–all-databases选项时),则在备份每个数据库前都会切换日志.当使用–lock-all-tables or –master-data时,日志只会被切换一次,因为此时所有的表都被锁住,数据库保持一致.所以当你想要备份和日志组切换同时发生时,要用–lock-all-tables or –master-data和–flush-logs一起使用;
  12. -h,–host=name:连接到主机;-u,–user-name:用户名;-p,–password:用户密码;
  13. –ignore-table=name:不备份指定的表,如果要指定多个表,则要数据库和表明一起指定,如:–ignore-table=database.table;
  14. -x,–lock-all-tables:会锁住所有数据库的表,会在备份期间加全局只读锁,自动关闭–single-transaction和–lock-tables选项;
  15. –master-data[=#]:使得二进制日志的位置和和名称被添加到输出文件中,如果等于1,会像CHANGE MASTER命令一样打印它,如果等于2,命令会以注释的形式出现.这个选项会打开–lock-all-table选项,除非–single-transaction选项也被指定(此时全局只读锁知会在开始备份时有效),可以通过show master status命令查看当前日志信息,在恢复和复制功能时有用.
  16. -n,–no-create-db:不包括创建数据库的语句;
  17. -t,–no-create-info:不包括创建表结构语句;
  18. -d,–no-data:只包含表定义,不包含表数据;
  19. –order-by-primary:使每个表中的记录按照主键排序,如果没有主键,则使用第一个唯一索引.当导出一个MyISAM表到一个InnoDB表时有用,但是会延长导出时间;
  20. –quick:不缓存query,直接导出到标准输出;
  21. -R,–routines:导出stored routines(存储过程和函数);
  22. –single-transaction:在一个事务中创建一个一致性的快照,只在支持多版本控制的引擎中起作用,目前只有innodb引擎.当–single-transaction进程工作时,为了保持数据一致性,则不能使用ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLEY语句,此选项自动关闭–lock-tables选项;
  23. –opt:与同时指定–add-drop-table, –add-locks, –create-options, –quick, –extended-insert, –lock-tables, –set-charset, and –disable-keys相同.默认开启,要关闭使用–skip-opt;
  24. -w,–where=name:只导出选择的记录;
如何使用mysqldump备份
  1. 非事务表的一致备份:mysqldump –opt –lock-all-tables –master-data=2 -B db_name1 db_name2 > /tmp/backup.sql,备份时表是只读的;
  2. 事务表的一致备份:mysqldump –opt –single-transaction –master-data=2 -B db_name1 db_name2 > /tmp/backup.sql,备份时表是可读写的;
mysqlbinlog工具
  1. 服务器生成的binary log files是二进制文件,想要查看这些文件,必须使用mysqlbinlog工具.还可以使用mysqlbinlog工具读取复制功能slave服务器产生的relay log files,它和二进制日志有相同的结构;
  2. 用法:mysqlbinlog [options] log-files;
mysqlbinlog的参数
  1. -d,–database=name:列出某一个数据库的日志,只用于本地日志;
  2. -f,–force-read:如果mysqlbinlog读到它不能识别的二进制日志,会打印警告而忽略该事件并继续,如果没有该事件则停止;
  3. -o,–offset=#:忽略前N个实体;
  4. -R,–read-from-remote-server:从远程服务器读取二进制日志,如果没有指定此选项,则–host, –user, –password, –port, –protocal, –socket选项都被忽略;
  5. -r,–result-file=name:直接输出到给定的文件;
  6. –start-datetime=time:读取二进制日志的生成开始时间,可以使用任何mysql服务器的时间格式,datetime和timestamp类型,如:’YYYY-MM-DD HH24:MI:SS’;
  7. –stop-datetime=time:读取二进制日志的生成结束时间;
  8. -j,–start-position=#:读取二进制日志的生成开始位置,是一个整型参数;
  9. –stop-position=#:读取二进制日志的生成结束位置,一个整型参数;
  10. -t,–to-last-log:在mysql服务器中请求的二进制日志结尾处不停止,而是继续打印直到最后一个二进制日志的结尾,如果将输出发送给同一台mysql服务器,会导导致无限循环,要与–read-from-remote-server连用;
  11. -D,–disable-log-bin:禁用二进制日志,如果使用–to-last-logs选项将输出发送给同一台mysql服务器,可以避免无限循环,该选项在崩溃恢复也很有用,可以避免复制已经记录的语句;
binlog解读
  1. 二进制日志记录的方式与binlog_format参数有关;
  2. 查看binlog的语法:? binlog;
  3. 记录的内容有:时间戳, 主机server id, 时间结束位置, 时间对象, 时间标志位, 内部binlog命令和相关注释;
mysql数据库的备份与恢复
  1. 只备份routines(存储过程和函数,-R参数,在information_schema.routines表中)和events(作业,-E参数,在information_schema.events表中)信息:mysqldump -n -t -d -R -E > /tmp/routines.sql;
  2. 备份表结构,视图,函数,存储过程和作业的信息:mysqldump -d -R -E -S /mysql/logs/mysqld.sock –databases db_name > /tmp/objects.sql;
  3. 备份数据库test,包括视图信息:mysqldump –opt –lock-all-tables -R -E –master-data=2 -B test > /tmp/test_backup.sql;(查看当前二进制日志的名称和位置:show master logs;);                                                       
  4. 对表进行修改,然后删除:
    1. insert into t values(1, now());
    2. insert into t values(2, now());
    3. insert into t values(3, now());
    4. drop table t;
  5. 查看表删除的位置:mysql>show binlog events;如果要查询某一个日志文件中的内容使用:show binlog events in ‘binlog file name’;                     
  6. 查看表备份文件的位置:grep “CHANGE MASTER” /tmp/test_backup.sql;                           
  7. 还原数据库:mysql < /tmp/test_backup.sql;直接执行备份的脚本文件,还原到备份的状态;
  8. 恢复数据库(注意mysqlbinlog的版本,应该使用mysql basedir下的mysqlbinlog):mysqlbinlog –start-position=117 –stop-position=480 /path/mysql-bin.000001 | mysql; 可以使用–disable-log-bin:禁用二进制日志;                                                   
  9. 建议把备份的数据库恢复到测试服务器,然后把数据导入到生产环境;
表结构的复制
  1. 第一种做法是:CREATE TABLE table_name AS SELECT * FROM tb_name;
    1. 可以复制表接口和表中数据,如果只想要表接口可以加一个false的过滤;
    2. 但是会丢失表中列上面的属性(如自增属性)和索引(主外键);
  2. 第二种做法是:CREATE TABLE table_name(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY) SELECT * FROM table_name;
    1. 可以在创建表时指定所有的属性,并同步数据;
    2. 但是语法太麻烦;
  3. 第三种做法是:CREATE TABLE table_name LIKE table_name;
    1. 只复制表结构,而且保留列的属性和索引;
    2. 如果想要数据的话可以INSERT table_name SELECT * FROM table_name;

MySQL学习8–MySQL5.1的用户管理

用户管理:我们可以定义一个account访问和控制mysql服务器.在MYSQL服务器中,account包含两部分,用户名和主机名.也就是说,当连接到服务器时,除了要检查用户名还要检查连接进来的主机.一个隐式的概念就是说用户名相同但是主机名不同的account是不同的account;
Mysql可以支持的权限类型
  1. 管理权限
    1. CREATE TEMPORARY TABLES:创建临时表;
    2. CREATE USER:创建/删除/重命名账户;
    3. FILE:在sql语句中读写操作系统的文件;
    4. LOCK TABLES:锁表;
    5. PROCESS:查看进程的活动状态;
    6. RELOAD:重新加载,FLUSH OR RESET;
    7. REPLICATION CLIENT:作为复制功能的主机;
    8. REPLICATION SLAVE:作为复制功能的备机;
    9. SHOW DATABASES:查看数据库名称;
    10. SHUTDOWN:关闭服务器;
    11. SUPER:各种管理操作;
  2. 数据访问权限
    1. ALTER:修改表结构,alter table;
    2. ALTER ROUTINE:修改或者删除存储过程和函数;
    3. CREATE:创建数据库或者表;
    4. CREATE ROUTINE:创建存储过程或者函数;
    5. CREATE VIEW:创建视图;
    6. DELETE:删除表中数据;
    7. DROP:删除数据库或者表;
    8. EXECUTE:执行函数或者过程;
    9. GRANT OPTION:授权给其它账户;
    10. INDEX:创建/删除索引;
    11. INSERT:向表中插入记录;
    12. SELECT:查询表的记录;
    13. SHOW VIEW:查看视图定义,show create view;
    14. UPDATE:更新表的记录:
  3. 特殊的权限
    1. ALL and ALL PRIVILEGES:即’all privileges except grant option’,授予账户除了把权限赋予其它帐号外的所有权限;
    2. USAGE:即没有任何权限,但是它可以连接到数据库上,也在user表中生成一条记录.这类账户的存在就是为了执行向’show variables’ or ‘show status’这类的语句,也不能查看表的内容;
  4. 权限的级别
    1. 所有的权限都可以被授予全局的,一个账户拥有全局权限,它可以在任何数据库任何时间使用此权限.一般只授予管理员这样的权限;
    2. 一些权限可以被授予特定的数据库:ALTER, CREATE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, GRANT OPTION, IDEX, INSERT, LOCK TABLES, SELECT, SHOW VIEW and UPDATE.一个数据库级别的权限可以应用于所有的tables和routines;
    3. 一些权限可以被授予特定的表:ALERT, CREATE, DELETE, DROP, GRANT OPTION, INDEX, INSERT, SELECT and UPDATE.一个标记别的权限可以应用于表中所有的列;
    4. 一些权限可以被授予表中的列:INSERT, SELECT and UPDATE;
    5. 一些权限可以被授予函数和存储过程:EXECUTE, ALTER ROUTINE and GRANT OPTION;
授权表
  1. 在mysql数据库中有几张授权表包含了服务器大部分的访问控制信息,它们包含了哪些是合法的账户和这些账户拥有的访问级别的信息;
  2. user:每一个账户在user表包含一条记录,它记录了用户拥有的全局的权限,也包含了一些其它信息,比如:使用资源的限制,客户端连接进来是否需要使用SSL链接;
  3. db:列出了账户对指定数据库的权限;
  4. tables_priv:列出了账户对指定表的权限;
  5. columns_priv:列出了账户对指定列的权限;
  6. procs_priv:列出了账户对存储过程和函数的权限;
  7. 服务器使用授权表中的信息决定是否允许客户端连接进来,也决定了客户端是否有权限执行某些语句,mysql服务器每次启动时都把授权信息载入到内存,以加快读取权限的速度,在一下两种情况下会刷新权限表的内存拷贝:
    1. 使用CREATE USER, GRANT, REVOKE or SET PASSWORD语句修改磁盘上的账户信息;
    2. 也可以显式的重新加载这些表使用FLUSH PRIVILEGES语句,执行mysqladmin flush-privileges or mysqladmin reload命令;
管理用户
  1. 查看当前的用户:
    1. select user();
    2. select current_user();
    3. show grants:查看当前用户权限信息;
    4. show grants for ‘user’@’host’:查看某个用户的权限信息;
    5. show processlist:查看当前连接进来用户的信息;
  2. create user创建一个用户(可选的指定密码,不指定的话为null),这个语句在user表中创建一条记录.它没有授予任何权限,可以之后使用grant语句.eg:create user ‘user’@’host’ identified by ‘password’;
  3. drop user回收一个账户的所有权限,并且删除这个账户.这会删除所有授权表中跟这个账户有关的信息,如果要收回用户权限而不删除用户要使用revoke语句.eg:drop user ‘user’@’host’;
  4. rename user改变一个现有账户的用那个户名,可以修改用户名或者主机名的任意一部分,或者两部分都修改.eg:rename user ‘user’@’host’ to ‘user’@’host’;
  5. 创建一个匿名账户,不需要用户名和密码即可登录,比较危险.eg:insert into user(host, user, password) values(‘%’, ”, ”);
  6. 修改用户的密码:set password for ‘u1’@’%’=password(‘u1’);
  7. 授权语句:grant privileges on objects to ‘user’@’host’ identified by ‘password’;
    1. on *.*:全局权限,所有的对象,eg:grant all privileges on *.* to ‘u1’@’%’ identified by ‘u1’ with grant option;
    2. on db_name.*:对数据库的权限,eg:grant select, update on test.* to ‘u1’@’localhost’;
    3. on db_name.tbl_name:数据库中表的权限,eg:grant select on mysql.user to ‘u1’@’localhost’;
    4. on db_name.tbl_name.col_name:数据库中表的列的权限,eg:grant select(host, user) on mysql.user to ‘u1’@’%’;
    5. on db_name.routine_name:数据库中routine的权限;
  8. 要添加用户并授权一般使用:grant 权限1,权限2,… on 数据库.表 to “username”@”host” identified by “password”;(创建用户的同时授予权限)
    1. grant all privileges on *.* to “user1″@”%” identified by “pwd”:表示对user1授予所有数据库中所有表的所有权限,并可以从任意客户端连接进来;
    2. grant select,insert,delete,update on mysql.user to “user1″@”192.168.0.1” identified by “pwd”:表示对用户user1授予mysql数据库的user表增删改查权限,并且只能从192.168.0.1客户端连接进来;
    3. host列为%表示可以从任意的客户端连接到服务器端;
    4. 一般在开发的时候使host为%,在生产环境修改host的地址;
  9. 回收权限:revoke prilileges on objects from ‘user’@’host’;
    1. 回收全局权限:revoke all privileges, grant option from ‘u1’@’%’;
    2. 回收数据库的权限:revoke select, grant option on mysql.* from ‘u1’@’%’;
    3. 回收表的权限:revoke select on mysql.user from ‘u1’@’%’;
    4. 回收列的权限:revoke select(host, user) on mysql.user from ‘u1’@’%’;
  10. 限制用户资源:默认情况下对客户端连进来的次数,查询次数等资源没有限制,grant语句可以对账户以下几个方面的资源做限制:
    1. 每个小时允许连到服务器的次数:max_connections;
    2. 每个小时允许查询的次数:max_questions;
    3. 每个小时允许更新的次数:max_updates;
    4. 用户的并发连接数:max_user_connections;
    5. 语句:grant all privileges on *.* to ‘u1’@’%’ identified by ‘u1’ with max_queries_per_hour 10 max_updates_per_hour 5 max_connections_per_hour 5 max_user_connections 8;
  11. 忘记用户密码
    1. Linux中的处理方法:
      1. 关闭服务器或者kill掉mysqld的进程;
      2. 使用–skip-grant-tables选项登录,启动服务器并跳过授权表
      3. 使用mysql登录,可以不用使用用户名和密码,并且有全部权限;
      4. 登录之后修改密码(set password for u1@’%’=password(‘pwd’)),或者直接更新mysql.user表密码字段为空即可;
    2. Windows中的处理方法:
      1. 停止mysql的服务:net stop mysql;
      2. 到mysql的bin目录下执行mysqld -nt –skip-grant-tables;
      3. 到新的命令行下执行mysqladmin -uroot flush-privileges password ‘pwd’;
      4. 然后关闭mysql服务:mysqladmin -uroot -p shutdown,此时输入刚刚设置的密码;
      5. 启动mysql服务:net start mysql;

MySQL学习7–MySQL5.1的存储引擎

MySql Storage Engines

  1. 存储引擎的概述
    1. MySql服务器管理的表都有一些相似之处:比如,数据库中每一个表在数据库目录都有一个format file(.frm),这个文件存储着表定义的结构,他是由服务器创建;
    2. 这些表也有一些不同之处:就是可以使用不同的存储引擎去管理表.每个存储引擎都有一系列的特点.比如每一个引擎都会创建一个额外的和.frm文件相对应的磁盘文件去管理数据和索引的存储.每个存储引擎也都会有自己的特点,比如有的会使用锁去管理查询竞争,有的会提供事务而有的没有事务.这些存储引擎属性都影响着查询的性能,并发和预防死锁.
  2. 如何使用CREATE TABLE语句显式指定存储引擎
    1. 查看CREATE TABLE的语法:? CREATE TABLE;
    2. 指定存储引擎:CREATE TABLE t (id integer) ENGINE=engine_name;
    3. 查看表使用了哪种引擎:
      1. 查询表结构:show create table table_name \G;
      2. 查询表信息:show table status like ‘table_name’ \G;
      3. 查询表所在数据库中所有表的信息:show table status from db_name \G;
      4. information_schema数据库存放了数据库的架构信息,可以查询tables表获得表的信息:use information_schema;select * from tables where table_name = ‘table_name’ \G;
    4. 查看服务器上支持的存储引擎
      1. show engines;
      2. show variables like ‘hava%’;
  3. MyISAM
    1. 在硬盘上MyISAM引擎用三种文件管理表,这些文件都在数据目录中
      1. .frm文件:存储表结构的定义;
      2. .MYD文件:存储表行的内容;
      3. .MYI文件:存储表的索引;
    2. 在操作系统上支持链接文件的特性,可以把数据文件和索引文件存放在不同的磁盘上以减小I/O;
      1. 查看当前服务器指定的默认存储引擎:show variables like ‘storage_engine’;
      2. 通过查看CREATE TABLE的帮助(? CREATE TABLE),我们可以看到,可以通过指定DATA DIRECTORY和INDEX DIRECTORY选项来把数据文件和索引文件存放在不同的目录;
        1. 创建存放数据文件和索引文件的目录:mkdir -p /tmp/mysql/data /tmp/mysql/index;
        2. 修改文件的权限:chown -R mysql:mysql /tmp/mysql;
        3. 创建表,并指定数据文件和索引文件的目录:CREATE TABLE t (id INTEGER) ENGINE=MyISAM DATA DIRECTORY=’/tmp/mysql/data’ INDEX DIRECTORY=’/tmp/mysql/index’;
        4. 此时就会在数据文件下创建真正数据文件和索引文件的链接;
        5. 有没有参数可以指定缺省的目录,每次创建表都去指定太费劲了吧;??????
        6. 分区表指定数据文件和索引文件;???????
    3. MyISAM与其它引擎相比具有最灵活的AUTO_INCREMENT COLUMN功能,自动增长列;
      1. 创建自动增长列:create table t(id integer auto_increment primary key, name varchar(50));
      2. 使用自动增长列(auto_increment),此列必须是主键或者是主键中的一列;
      3. 插入时可以指定id列也可以不指定,如果指定的话就插入指定的值,如果不指定则插入比当前最大值大1的值,即max(id)+1;
      4. 获得上次插入的id值使用last_insert_id()函数:select last_insert_id();
      5. 设置自动增长id的初始值:alter table table_name auto_increment=n;但是如果这是的n小于max(id)则不生效;
      6. 为一个已存在的表增加一个自增长列:alter table table_name add column col_name integer auto_increment not null, add primary key(id);
    4. 不支持事务
      1. 查看自动提交事务的选项:show variables like ‘autocommit’;
      2. 修改此选项:set session autocommit=0|1;
      3. 因为不支持事务,所以不管此选项为何值,都不能commit和rollback;
    5. MyISAM的表可以被转换成一个fast,compressed,read-only的表从而节省空间
      1. 使用myisampack工具:mysqlpack –help;
      2. 进入到数据文件目录:myisampack table_name;                                                          
      3. 观察发现压缩比例为90%,只剩下10%的数据量大小;对指定DATA DIRECTORY和INDEX DIRECTORY选项的表同样使用,亲测;
      4. 重启之后检测表(check table table_name)就会发生错误,表内数据丢失,对只读的性能支不好,如果使用的话,压缩完之后一定要备份;
    6. MyISAM支持FULLTEXT索引和spatial数据类型,全文索引和空间数据类型
      1. 对全文索引支持不够好,可以使用instr()函数去实现;
      2. 也可以使用第三方的插件去实现;
    7. MyISAM引擎对锁的支持
      1. MySql管理使用MyISAM引擎的表之间的查询竞争使用表级的锁,这使得查询的性能非常快,多个查询可以同时访问一张表.对于写操作,会使用一个exclusive的表级锁去阻止其它读写操作.虽然表级锁会影响点性能,但是不会发生死锁;
      2. 显式的对表加锁:lock table table_name lock_type; lock tables table_name1 lock_type, table_name2 lock_type;
      3. 解锁:unlock tables;
      4. 如果在session中加write锁,则本session可以进行读写操作,其它的session对表进行读和写就需要等待锁释放;
      5. 如果在session中加read锁,则本session和其它session都可以进行读操作,本session无法进行写操作,其它的session对表进行读和写就需要等待锁释放;
      6. 如果在session中加read local锁,即只锁住加锁前一时刻的表的数据,则本session可以进行读操作(查到的只是加锁前的数据),但是不能进行写操作,其它session可以进行插入操作(查到的是所有的数据),但是删除和更新操作需要等待锁释放;
    8. 可以通过LOW_PRIORITY和HIGHT_PRIORITY来影响MyISAM表的内部调度机制;可以通过INSERT DELAYED先把表中数据缓存到服务端,等到表不忙的时候再插入;
      1. 一般情况下在OLTP系统中,更新操作优先于查询操作,因为更新操作时间比较短,查询操作时间比较长(所以一般要提升查询操作的优先级,降低更新操作的优先级);要修改查询的优先级使用:SELECT HIGH_PRIORITY * FROM t;修改更新语句的优先级使用:INSERT INTO t VALUES(1);可以使用read local锁做实验,优先级低的无法插入,优先级高可以插入;
      2. 数据延迟插入:INSERT DELAYED INTO t VALUES(1);可以使用write锁来模拟这种情况,不实用delayed则等待,使用就马上返回成功,但是真正插入要等表不忙的时候;当有延迟操作时会产生一个延迟进程,它是一个共用的线程,只有一个;
      3. 查看当前链接到服务器的进程列表:show processlist;杀掉进程:kill id;
      4. 与延迟插入有关的全局变量:show global variables ‘%delayed%’;
        1. delayed_insert_limit:延迟插入时,插入多少条数据后检查是否有查询操作,如果有查询操作,则查询操作先执行;
        2. delayed_insert_timeout:限制延迟操作的等待时间;
        3. delayed_queue_size:定义延迟线程队列的大小,以行为单位;
      5. 与延迟插入有关的全局状态:show global status ‘%delayed%’;
        1. delayed_errors:记录延迟插入错误的次数;
        2. delayed_insert_threads:当前有多少线程在使用延迟操作;
        3. delayed_writes:使用延迟线程插入的记录行数;
    9. 数据表的存储格式是非常的轻便的,因此可以通过直接拷贝表所在的目录到其它的主机以实现对表的备份额迁移
      1. 拷贝时需要注意文件的权限和拥有者,一般指定cp -a选项;
      2. 拷贝表时可能会有缓存,最好能在关闭服务器的情况系进行,以保证数据完整性;(岂不是保障不了高可用性了?)
    10. 可以指定一个MyISAM表最少存储多少条记录,这允许MyISAM表去调整表内部行指针的大小,也可以配置缺省的表内部行指针大小供服务器使用
      1. 在创建表时使用MAX_ROWS和MIN_ROWS选项(? CREATE TABLE),这个值只是一个参考值,实际的数据行数可以大于也可以小于这个值;
      2. 配置系统默认大小使用myisam_data_pointer_size选项:show variables like ‘myisam_data_pointer_size’,这个选项是当创建表时没有使用MAX_ROWS选项时使用,默认为6,不能小于2也不能大于7.它代表可以用几个字节(一个字节是8位)去寻址,指定n,表示2的8n次方,即指定为2,3,4,5,6时依次代表可以存放64K,16M,4G,1T,256T的数据;
      3. 把max_rows设为5,myisam_data_pointer_size范围是2~7,2个字节就足够了(2^16),所以其实就是让myisam是用2个字节的指针,并不是说最多5行.如果把max_rows设置为大于2^16的值,就要用3个字节表示,所以myisam_data_pointer_size会设为3,此时最多存放2^24行.
      4. 如果创建表时指定了max_rows,那么表至受限于最大的行数;如果没有max_rows,则表受限于最大大小;
    11. 导入数据时,可以先禁用掉索引,等到导入数据后再打开索引,这样会加快导入数据的速度.当使用LOAD DATA [LOCAL] INFILE导入数据时,它会自动的禁用和启用索引,以加快导入速度
      1. 查看LOAD DATA [LOCAL] INFILE的帮助:? load data; load data [local] infile file_name into table table_name;
      2. 与LOAD DATA INFILE相对应的是SELECT … INTO OUTFILE,把表中的数据导入到文件中;
      3. 语法:select * from t into outfile ‘/tmp/t.txt’ fields terminated by ‘,’ enclosed by ‘”‘; 字段以[“]包围,字段之间以[,]号分割,默认每行之间以换行分割;
      4. 语法:load data infile ‘/tmp/t.txt’ into table t fields terminated by ‘,’ enclosed by ‘”‘;
    12. 向MyISAM表中添加数据时,如果磁盘空间不足时服务器会挂起操作,直到空间变为可用状态,然后继续完成操作;
    13. MyISAM表的行存储格式
      1. 查看表使用哪种行存储格式:与查看表使用引擎的方式一样,表信息的Row_format字段.
        1. 表中包含有可变长度的列,则表就是Dynamic的;
        2. 表中没有包含可变长度的列,表就是Fixed的;
      2. 固定行存储格式:
        1. 所有的行有固定的大小;
        2. 行存储的位置是在行长度的整数倍的位置,方便查找;
        3. 占用更多的存储空间;
      3. 动态行存储格式:
        1. 行占用动态的长度;
        2. 查看起来不是很高效;
        3. 节省空间;
        4. 更容易产生碎片;
      4. 压缩行存储格式:
        1. 表被压缩以节省空间;
        2. 优化的存储以加快检索;
        3. 表是只读的;
      5. 做实验时可以使用hexdump工具,查看数据文件中实际存放的数据,可以加上-C选项;
      6. 手动像数据表文件中添加数据后不可用,需要经历check table table_name; optimize table table_name; repair table table_name;三个过程,应该是在information_schema库中写入统计信息;
  4. InnoDB
    1. 每一个InnoDB的表在磁盘的数据目录下都有一个.frm文件和存储数据和索引的表空间,InnoDB的表空间是一个逻辑的单存储区域,这个区域由一个或者多个文件组成,还可以使用裸分区.缺省情况下,一个InnoDB的表空间存放所有的InnoDB的表的内容,这种表空间的存储是与机器无关的,根据此特性,我们可以把InnoDB表空间拷贝到其它机器上完成备份和迁移.单个表的最大尺寸可以达到操作系统支持的最大大小.同样可以配置InnoDB使得每个表使用单独的表空间(innodb_file_per_table);
      1. InnoDB引擎的操作需要主要需要两块磁盘资源,一个表空间用来存放数据和索引,一系列的日志文件用来记录当前活动的日志;
      2. 每个InnoDB表都有一个.frm文件,这一点与其它的存储引擎相同.然而不同的是,InnoDB存储数据和索引在共享表空间,这是一个或者多个单独的逻辑存储区域,所有的InnoDB表都存储在一个表空间中.这个表空间也包含一个rollback节,事务修改记录的信息和undo日志信息都存储在这个节中,这些信息用于回复失败的事务;
      3. 在共享表空间的文件可以设置为自动增长,因为共享表空间保存着所有数据库中所有的InnoDB表,所以共享表空间文件默认存放在服务器的数据目录下,而不是某一个数据库目录下;
      4. 如果不想使用共享表空间存储表的内容,可以打开innodb_file_per_table选项,这样,对于每一个InnoDB表都会生成一个.idb的文件存放数据和索引和一个.frm文件保存表结构.但是共享表空间仍然是必须的,因为它要保存InnoDB的数据字典和rollback节.使用此选项不影响以前创建在共享表空间中的表;
    2. InnoDB引擎支持事务,可以使用commit和rollback,它遵循ACID机制,由于多版本控制(Multi-versioning),每个事务之间是互补影响的;
      1. ACID
        1. Atomic:整个事务事务中的所有的操作要不全都成功,要不全都取消;
        2. Consistent:在事务开始之前和事务结束以后,数据的完整性约束没有被破坏;
        3. Isolated:两个事务的执行是互不干扰的;
        4. Durable:事务完成以后,该事务对数据库所有的操作便持久的保存在数据库中,不会被回滚;
      2. 事务模型
        1. 显式的关闭自动提交功能:set autocommit=0;
        2. 开启一个事务:start transaction;
    3. 当MySql服务器或者主机crash之后,InnoDB提供了自动回复机制;
    4. MySql管理InnoDB的查询竞争使用多版本控制和行级锁,多版本控制是的每个事务都有一个单独是数据库界面;而行级锁使得查询竞争减小到最小,这使得多查询写入的时候效率最高,但是会导致死锁;
    5. InnoDB支持外键和引用完整性,包括级联删除和更新;
      1. 使用外键的两个表都必须是InnoDB的表,而且不能是临时表;
      2. 在父表中,被引用的列必须是键.在字表中作为外键的列必须是索引或者是组合索引的第一个,如果他不存在,在创建索引的时候会自动被创建;
      3. 使用外键的列不支持索引前缀;
      4. 如果使用CONSTRAINT子句时,要保证对象名是全局唯一的;
      5. 查看索引:show index from table_name \G;
    6. 数据表的存储格式是非常的轻便的,因此可以通过直接拷贝表所在的目录到其它的主机以实现对表的备份额迁移;
    7. 配置一个InnoDB表空间
      1. 它包含一个或者多个文件;
      2. 表空间中的内个组件可以是一个一般的文件或者是裸设备,或者是两种文件都有;
      3. 表空间文件可以在不同的文件系统或者是物理磁盘上.这样使用的一个原因是使用分布式系统;
      4. 表空间的大小可以超过文件系统支持的最大文件大小,主要是有两个原因
        1. 表空间由一个或者多个文件组成,因此大于一个单独的文件;
        2. 表空间可以包含裸设备,它不受限于文件系统的大小,可以使用裸设备的所有的extent;
      5. 表空间的最后一个文件可以自动增长,也可以定义文件的增长大小;
      6. 指定配置文件中的innodb_data_file_path参数(通过show variables like ‘innodb_data_file_path’);
        1. 默认路径下指定:[innodb_data_file_path=ibdata1:10M;ibdata2:10M:autoextend]两个文件之间用[;]分割,最后一个文件可以指定自动增长;
        2. 指定InnoDB的路径:innodb_data_home_dir指示数据文件的路径,缺省是在数据目录下面,innodb_log_group_home_dir指示日志文件的路径;
    8. 配置InnoDB的缓冲区:InnoDB使用一个缓冲池去存放经常读取的物理表的信息,目的是为了减小IO,缓冲池越大越好.可以使用innodb_buffer_pool_size参数改变缓冲池的大小.
      1. innodb_buffer_pool_size:定义了在内存中缓存表和索引的大小,这个值越大,访问硬盘的IO越小.在一个专用的数据库服务器中,你可以设置它的大小为物理内存的80%,当然也不能设置的过大,否则就会使用到交换分区;
      2. innodb_additional_mem_pool_size:表示存放数据字典和其它数据表结构的信息的大小.表越多,这个空间分配的要越大.如果这个空间大小不够的话,就会从操作系统申请空间,并在error log中记录警告信息;
      3. innodb_max_dirty_pages_pct:配置dirty page的百分比,默认为75,当脏数据超过这个值的时候,进程就会把这些页从缓冲池写入到硬盘上;
      4. 查看innodb的状态变量show golbal status like ‘innodb_%’;innodb_page_size:是每一页的大小,一般为16k;Innodb_buffer_pool_pages_total:是一共有的页数;
  5. Merge
    1. MERGE表是一组MyISAM表的集合,每一个MERGE表在磁盘上都有2个文件,一个是.frm文件和一个包含组成MERGGE表的MyISAM表的名称的.MRG文件.这两个文件都存放在数据库目录下;
    2. 当对一个MERGE表操作时,相当于对组成MERGE表的所有的MyISAM表的操作;
    3. 一个MERGE表可以突破MyISAM表的最大大小的限制;
    4. MYSQL管理MERGE表的查询竞争使用表级锁,即锁住组成它的MyISAM表,所以不会产生死锁;
    5. 一个MERGE表是很轻便的,因为.MRG文件是一个文本文件;
    6. 可以进行增删改查操作,在插入操作时可以指定是往哪个表中插入数据;
    7. 当MERGE引擎要锁住一个MERGE表时,就会对组成它的所有MyISAM表加锁;
    8. 对MERGE表执行SEELCT操作时,对底层的表加read lock;
    9. 对MERGE表执行更新操作(delete, update)时,对底层的表加write lock;
    10. 对MERGE表的操作:
      1. 创建MyISAM表m1:create table m1(id int, name varchar(10)) engine=myisam;
      2. 创建MyISAM表m2:create table m2(id int, name varchar(10)) engine=myisam;
      3. 创建MERGE表:create table m(id int, name varchar(10)) engine=merge union=(m1, m2);
      4. 插入数据:insert into m1 values(1, ‘a’);insert into m1 values(1, ‘a’);
      5. 查询:select * from m;
      6. 创建MyISAM表m3:create table m3(id int, name varchar(10)) engine=myisam;
      7. 加入merge表:alter table m union=(m1, m2, m3);很灵活,可以互相组合;
      8. 修改表使得merge表可以插入数据,create table m(id int, name varchar(10)) engine=merge union=(m1, m2) insert_method=last;method_method=0:不允许插入;first:插入到union中的第一个表;last:插入到union中最后一个表;
    11. 可以通过直接修改.MRG文件来修改MERGE表,修改后使用flush tables;来刷新表缓存;
  6. Memory
    1. MEMORY表的.frm文件在数据库目录下,数据和索引都存储在内存中;
    2. 对MEMORY表的操作性能都很高;
    3. 在服务器重启之后,MEMORY表中的数据就不存在了,但是他的表结构还是存在的;
    4. 因为MEMORY表使用的是内存,所以不适用于大表;
    5. MEMORY表使用表级锁来处理查询竞争,所以不会发生死锁;
    6. MEMORY表不支持TEXT和BLOB类型;
    7. 它支持两种索引:HASH和BTREE
      1. 缺省使用HASH索引,这种索引算法使用唯一索引会非常高效,然而HASH索引只能用于比较运算符(=, <>);
      2. BTREE索引算法更适合于范围查找,例如>,<或者between;
    8. 可以使用创建表时的max_rows和服务器参数max_heap_table_size来限制MEMORY表的大小;
    9. 设置索引:
      1. hash:alter table table_name add index idx_name using hash(col_name);
      2. btree:alter table table_name add index idx_name using btree(col_name);
    10. 当不需要MEMORY表的内容时,要释放被MEMORY表使用的内存,使用DELETE FROM, TRUNCATE TABLE或者删除整个表DROP TABLE;
  7. Federated
    1. 它访问的是在远程数据库表中的数据,而不是本地的表,仅在-MAX版的MySql可用;
    2. 如果要使用需要在在configure时添加–with-federated-storage-engine选项;
    3. 创建一个FEDERATED表时,服务器在数据库目录创建一个.frm文件,没有表数据文件,因为实际数据在远程数据库上;
    4. 操作表的内容时需要MYSQL客户端API,读取数据通过SELECT * FROM table_name来初始化,然后通过mysql_fetch_row()的c函数去一行行读取;
    5. 创建一个FEDERATED表
      1. 假设在远程服务器上有一个表为tbl;
      2. 在本地创建表:create table federated_tbl(id int, name varchar(10)) engine=federated connection=’mysql://root@remote_host:3306/federated/tbl’;
      3. 其他CONNECTION的格式:
        1. CONNECTION=’mysql://username:password@hostname:port/database/tablename’;
        2. CONNECTION=’mysql://username@hostname/database/tablename’;
        3. CONNECTION=’mysql://username:password@hostname/database/tablename’;
    6. 局限性
      1. 远程服务器必须是一个MYSQL服务器;
      2. 不支持事务;
      3. 支持增删改查的操作和索引,但是不支持ALTER TABLE和DROP TABLE;
    7. 用途:可以跨服务器访问,不用创建DB LINK了;
  8. BDB
    1. 需要下载包含BDB版本的MYSQL(MySql-Max分发版支持BDB);
    2. 安装时在configure加入–with-berkeley-db选项;
    3. BDB启动选项
      1. –bdb-home:指定BDB表的基础目录,应该和–datadir相同;
      2. –bdb-lock-detect:BDB锁定检测方式,DEFAULT,OLDEST,RANDOM,YOUNGEST;
      3. –bdb-logdir=path:BDB日志文件目录;
      4. –bdb-no-recover:不在恢复模式启动Berkeley DB;
      5. –bdb-no-sync:不同步刷新BDB日志,使用–skip-sync-bdb-logs代替;
      6. –bdb-shared-data:以多处理模式启动Berkeley DB(初始化Berkeley DB之时,不要使用DB_PRIVATE);
      7. –bdb-tmpdir=path:BDB临时文件目录;
      8. –skip-bdb:禁止BDB存储引擎;
      9. –sync-bdb-logs:同步刷新BDB日志.这个选项默认被允许,请使用–skip-sync-bdb-logs来禁止它;
    4. 创建一个BDB表会有两个文件,一个是.frm文件,一个是存放表数据和索引的.db文件;
    5. 支持事务;
    6. 每一个BDB表都需要一个primary key,如果创建时不指定则会隐式创建一个;
    7. SELECT COUNT(*) FROM tbl_name对BDB表很慢,因为在该表中没有行计数被维持;
    8. 使用页面级别的锁;
    9. 使用mysql客户端是,应该使用–no-auto-rehash选项;
    10. BDB表的限制
      1. 每个BDB表在.db文件里存储文件被创建之时到该文件的路径,这个被做来允许在支持symlinks的多用户环境里检测锁定.因此,从一个数据库目录往另一个目录移动BDB表是不能的;
      2. 当制作BDB表的备份之时,你必须使用mysqldump要么做一个包含对每个BDB表的文件(.frm和.db文件)及BDB日志文件的备份.BDB存储引擎在它的日志文件存储未完成的事务以及要求它们在mysqld启动的时候被呈出来.BDB日志在数据目录里,具有log.XXXXXXXXXX(10位数字)形式名字的文件;
      3. 如果允许NULL值的列有唯一的索引,只有单个NULL值是被允许的,这不同于其它存储引擎;
  9. EXAMPLE
    1. EXAMPLE引擎是一个不做适合事情的存储引擎,主要用于MySql源码中一个例子用来演示如何开始编写一个新的存储引擎;
    2. 需要在configure时添加–with-example-storage-engine选项;
    3. EXAMPLE引擎不支持编译索引;
  10. Archive
    1. ARCHIVE引擎被用来以非常小的空间存储大量无索引数据;
    2. 要使用此引擎需要在configure时添加–with-archive-storage-engine选项;可以通过show variables like ‘have_archive’查看;
    3. 创建一个ARCHIVE表会有一个保存表结构的.frm文件,保存数据和元数据的.ARZ和.ARM文件,如果有优化操作的话还有一个.ARN文件;
    4. ARCHIVE引擎仅仅支持SELECT和INSERT操作,以除了几何数据类型外的所有数据类型;
    5. 存储:当inesrt数据时,archive引擎使用zlib无损数据压缩的方式压缩,optimize table可以分析表,并打包为更小的格式;
    6. 查询:在查询数据时,记录根据需要被加压缩,没有行缓存.SELECT操作执行完全表格扫描,当一个SELECT发生时,它找出当前有多少行可用,并读取行的数量;
  11. CSV
    1. CSV引擎使用逗号分隔值格式的文本文件存储数据(eg:[“1″,”aaa”]);
    2. 要想使用此引擎在configure时使用–with-csv-storage-engine选项;
    3. CSV引擎不支持null值,所以在创建时应加上not null选项;
    4. CSV引擎不支持索引;
    5. 创建CSV表会在数据库目录创建一个.frm文件,一个.CSV的文本文件用来存储数据和一个.CSM文件;
  12. Blackhole
    1. BLACKHOLE引擎就像黑洞一样,它接收数据但是是丢弃它而不是存储它,查询时总返回NULL;
    2. 创建BLACKHOLE引擎后会在数据库目录创建一个.frm文件,没有其它文件与之关联;
    3. 它支持所有的索引;
    4. 要想使用此引擎在configure时使用–with-blackhole-storage-engine选项;
    5. 用途:
      1. BLACKHOLE表不记录任何数据,如果二进制日志被允许,SQL语句被写入日志,可以用作重复器或者过滤器机制;
      2. 转储文件语法的验证;
      3. 来自二进制记录的开销测量,通过比较允许二进制日志功能的BLACKHOLE的性能与禁止二进制功能的BLACKHOLE的性能;
      4. 因为BLACKHOLE本质是一个no-op存储引擎,可以用来查找与引擎自身不相关的性能瓶颈;

MySQL学习6–MySQL5.1的体系架构

MySql体系架构:

Mysql各个模块执行的过程:
  1. 初始化模块:当服务器启动的时候,初始化模块就会解析控制文件和命令行参数,分配全局的缓存,初始化全局变量和结构,加载访问控制表和执行其它的初始化任务.一旦初始化工作完成,初始化模块转交控制权给连接管理器,它是以一个循环的方式接收客户端的连接;
  2. 连接管理模块:当客户端连接到数据库服务器,连接管理模块执行一些底层的网络命令并把控制权交给线程管理模块;
    1. max_connections:定义服务器最大的连接数;(show variables like ‘%connect%’)
    2. max_user_connections:定义服务器针对单个用户最大的连接数;
    3. Aborted_connects:失败的连接数;(show global status like ‘%connect%’);
    4. Connections:连接的次数;
    5. Max_userd_connections:最大使用连接数,最大的并发量;
    6. Threads_connected:当前连接了多少个进程,与show processlist的结果相同;
  3. 线程管理模块:线程管理模块会提供一个线程,可能是新建的,可能是从线程池中获得的,一旦线程建立好,就会把控制权交给用户验证模块;
  4. 用户验证模块:会验证连接的用户名,密码和客户端IP,验证通过之后就会接收客户端发送的命令,然后交给命令分发模块;
  5. 命令分发模块:
  6. 日志模块:每一个查询都会记录通用查询日志;
  7. 查询缓存模块:命令分发器把查询发送给查询缓存模块,查询缓存模块查看这个查询是否是可以缓存的类型,并且查找之前是否缓存过,如果查询命中,就会把纯纯的结果返回给用户,连接管理模块就会接到控制权并处理下一个命令;如果查询缓存模块没有命中,则查询给解析器,它决定了根据查询如何转交控制权;
  8. 命令解析器:命令解析器选择那种方式;
  9. 查询优化器:查询语句会使用查询优化器;
  10. 表变更模块:插入,删除,创建表,架构修改会使用条变成模块;
  11. 表维护模块:检查,修复,更新键统计会使用表维护模块;
  12. 复制模块:和复制相关的查询会使用复制模块;
  13. 状态模块:状态报告会使用状态报告模块;
  14. 访问控制模块:在这一步,通过检查命令解析器模块涉及到的表或者列是否有权限,验证之后把控制权交给表管理模块;
  15. 表管理模块:会执行表的打开和锁定,并调用具体的存储引擎接口;
  16. 存储引擎接口:存储引擎接口实行行级别的操作;
  17. 核心API:内存管理,数字函数,字符函数;
  18. 网络交互模块:网络监听,协议处理;

MySQL学习4–获得MySQL5.1的帮助

如何获得帮助

  1. 官方帮助文档(chm);
  2. 客户端工具(mysql>help);
    1. ?与help一样,获得帮助信息;
    2. clear:清除当前输入的语句,在错误的语句后面输入\c即可;
    3. connect:重新连接服务器,可以指定主机名和服务器,输入connect dbname host或或者\r dbname host即可;
    4. delimiter:语句分隔符,设置执行语句的符号,执行delimiter $$即可;
    5. edit:调用vi修改sql语句,在要修改的语句后面输入\e即可;
    6. go:发送命令到mysql服务器;
    7. pager:查询内容太多,分页显示,设置:>pager less,禁止:>nopager;
    8. tee:把查询结果输入到一个文件中:>tee /tmp/rst.txt,禁止notee,主要用于数据库的备份脚本输出;
    9. prompt:改变提示符,如:prompt royalwzy>;则每次输入命令是提示符变为royalwzy>字符串(可以在配置文件中定义,prompt=xxx);
    10. quit/exit:都是退出客户端,输入quit,exit和\q都行;
    11. source:执行一个sql脚本文件,文件名为参数,source /tmp/sql.txt;
    12. system:执行操作系统的命令,用法:system ls -l /tmp 或者\! ls -l /tmp;
    13. status:查看服务器信息的状态,输入status或者\s即可;
    14. use:改变使用的数据库,后面跟数据库的名称,eg:use mysql;
    15. charset:修改字符集,可以通过status查看当前使用的字符集,eg:charset latin1;
    16. warnings:开启警告信息,当输入的sql语句出错时,可以通过show warning或者show errors来打印警告或者错误信息,设置:warning或者\W,关闭:nowarning或者\w;
    17. rehash:设置客户端自动补全功能;
      1. 在服务器的配置文件中[mysql]节点下,默认使用no-auto-rehash选项;
      2. 注释no-auto-rehash选项,添加auto-rehash选项,reboot;
  3. 获得服务器端帮助:>help contents;
    1. 可以通过help cmd获得更详细的信息;
    2. 获得管理操作的命令:>help administration;
    3. 获得数据类型:>help data types;
    4. 获得show命令的帮助:help show; ? show;
    5. show variables:打印系统变量,类似oracle中的show parameter;
      1. 查询包含某一关键字的变量:show variables like ‘%buffer%’;
      2. 设置变量的值用set命令:set global|session key=value;
  4. show variables和show status的区别
    1. show variables:当服务器运行之后如果没有人工干预所有的参数不会发生改变;
    2. show status:显示服务器运行过程中的动态信息,值会动态改变;
  5. 获得表中前几行数据使用:select * from table_name limit n;

MySQL学习5–MySQL5.1的物理结构

Mysql的物理结构

  1. 日志文件
    1. error log:
      1. 记录mysql启动,关闭和运行时产生的重大的错误的信息;
      2. 如果mysqld警告一个表需要自动的检查或者修复,也会记录一个错误日志;
      3. 可以使用–log-error=file_name选项来指定错误日志文件,如果没有指定,则系统默认在data目录下生产一个hostname.err的文件;
      4. 也可以在配置文件中配置log_error变量;
      5. 查询log_error的位置:>show variables like ‘log_error’;查看主机名:>system hostname;
    2. binary log:
      1. 记录所有对数据库更新和潜在的更新语句(一个delete语句,但是没有影响的行),语句以事件(event)的方式存储,同时也包含了更新语句执行的时间信息;
      2. 它不记录那些不修改任何数据的语句,如果想要记录所有的语句,可以使用query log;
      3. 它主要的目的是在做还原操作时尽可能全的更新数据库,因为它包含在一次备份后的所有更新操作.它同样被用在master replication server中作为一个记录发送给slave servers;
      4. 打开二进制日志会损失1%的性能,但是它带来的好处远远超过这些;
      5. 查看二进制日志是否打开,需要查看log_bin参数是否是ON:>show variables like ‘binlog_format’;
      6. 命令行参数
        1. –log-bin=filename:记录二进制日志文件的位置,尽量指定路径名,如果不指定的话则保存在数据目录;
        2. –log-bin-index=file:记录二进制日志文件索引的位置,保存了日志文件名;
        3. –max_binlog_size:单个文件最大多少;
        4. –binlog-do-db=db_name:哪个数据库使用,只有这个数据库使用;
        5. –binlog-ignore-db=db_name:哪个数据库不使用,只有这个数据库不使用;
      7. 系统变量
        1. log_bin:日志的位置;
        2. binlog_cache_size:二进制日志缓存大小,是每一个连接进来的线程分配的大小,不是整个服务器的大小;
        3. max_binlog_cache_size:最大缓存大小;
        4. max_binlog_size:单个文件最大大小,超过此大小则再分配一个文件,但是一个事务必须在一个文件中,所以可能会稍大点;
        5. binlog_cache_use:当前连接使用的binlog缓存的事务的数量,使用show status like ‘binlog_cache_use’查看(show status命令显示了所有连接到mysql服务器的状态值);
        6. binlog_cache_disk_use:如果binlog_cache_use不够用,则在磁盘上缓存,应该尽量避免;
        7. binlog_do_db:设置master-slave时使用;
        8. binlog-ignore-db:设置哪个数据库不记录日志;
        9. sync_binlog:缓存与硬盘的同步频率(commit多少下同步一次,0表示服务器自动控制);
      8. 查看当前二进制文件的名称和大小,show binary/master logs;
      9. 如果不指定二进制日志文件的位置,默认存放在data文件夹下,日志文件是:mysql-bin.xxxxxxx,索引文件是mysql-bin.index;
      10. 如果要切换日志的话,执行flush logs命令;
      11. 初始化二进制日志系统,从新生成:reset master命令;
      12. 删除某个日志文件:purge binary logs [before ‘datetime’ / to ‘log_name’] 删除指定日期之前的和删除指定文件之前的日志文件;
      13. 设置日志文件的失效期:参数为expire_logs_days,set global expire_log_days=n,N天前的日志自动删除;
      14. 二进制日志的格式
        1. 查看格式:show [global] variables like ‘binlog_format’;
        2. 设置日志格式:set [global] binlog_format = statement|row|mixed;
        3. 使用mysqlbinlog程序打开;
    3. general query log:
      1. 一般查询日志记录服务器运行期间所有操作的日志.当客户端连接或者断开的时候服务器会记录信息到日志中,并记录所有从客户端接收到的sql语句,它对于在客户端中排错和查看是哪个客户端发送的命令很有帮助;
      2. mysqld是按照接收到命令的方式记录语句的,这可能跟它们执行的顺序不同(这与二进制日志是有区别的,二进制日志是执行后记录).
      3. 在mysql5.1.6中可以使用–log选项启动和使用–log-output选项指定日志输出的位置,也可以输出到”Server Log Tables”表中.在5.1.6之前,开启此功能是用–log=file_name or -l file_name选项(之后版本使用–general-log选项),如果没有指定file_name,默认是在data目录下生产一个hostname.log文件;
      4. 服务器重新启动和log flush不会产生一个新的文件;
      5. 默认此功能关闭,通过show variables like ‘log’/’general_log’,log与general_log意思相同;
      6. 设置打开一般查询日志:set global log=1;(两个变量会同时打开关闭,打开之后立即生效);
      7. 可以在启动的时候指定–general-file选项或者在配置文件中指定general_log=1,general_file_log=/path;
      8. 一半不打开此日志功能,数据量太大,如果打开可以放到单独的磁盘中.
      9. 备份切换一般日志文件:
        1. 先备份:>mv hostname.log hostname.log.bak
        2. 切换日志组:mysqladmin flush-logs;
    4. slow query log:
      1. 调优时使用,记录超出指定时间的sql语句;
      2. 慢查询日志主要记录执行时间超过long_query_time变量指定时间的sql语句,这个时间不包括获得锁的时间,只包含执行时间,系统默认时间是10s(long_query_time=10.0);
      3. 在mysql5.1.6版本可以指定mysqld的–long-slow-queries=file_name选项启动,在之后的版本使用–slow-query-log=0|1选项和–slow-query-file-log=file_name选项指定;
      4. 命令行参数:
        1. –log-slow-queries=file_name;指定慢查询日志文件
      5. 系统变量:
        1. low-query-log:开启慢查询功能,set global low-query-log =0|1;
        2. slow-query-file-log:指定慢查询日志文件,系统默认是在data目录下的hostname-slow.log文件;
        3. long_query_time:指定查询的最大时间,set global long_query_time=n;
        4. long_queries_not_using_indexes:不用索引的慢查询,默认是功能关闭的;
          1. 查看某个表是否有索引:> show index from t;
          2. 打开此功能:>set global long_queries_not_using_indexes =1;
          3. 查看变量:>show variables like ‘long_queries_not_using_indexes’;
      6. 分析慢日志文件的工具:mysqldumpslow,查看具体的帮助是用mysqldumpslow –help;
    5. innodb redo log;
      1. 与innodb数据引擎相关;
      2. 用来实现灾难恢复(crash recovery),突然断电会导致innodb表空间中的数据没有写到磁盘上,通过执行redo log能够重新执行这些操作来恢复数据;
      3. 提升innodb的i/o性能,innodb引擎把数据和索引都载入到内存中的缓冲池中,如果每次休息数据和索引都需要更新到磁盘,必定会增加i/o请求,而且因为每次更新的位置都是随机的,磁头需要频繁的定位导致效率很低,所以innodb每处理完一个事务后只添加一条日志log,另外有一个线程负责智能的读取日志文件并批量更新到磁盘上,实现最高效的磁盘写入;
      4. 系统变量:
        1. innodb_log_buffer_size:日志缓冲区的大小;
        2. innodb_log_file_size:日志文件的大小;
        3. innodb_log_files_in_group:一组日志中有几个文件:
          1. 文件名为ib_logfileX(X从0开始一次增加);
          2. 先关闭数据库服务:>mysqladmin shutdown(mysql.server stop);
          3. 把data目录下的ib_logfile*文件移动走:>mv ib_logfile* /tmp;
          4. 在配置文件中添加innodb_log_files_in_group=n的参数;
          5. 启动数据库服务:>mysqld –defaults-file=./my.cnf –user=mysql(mysql.server start);
          6. 可以查看error log文件观察启动过程;
        4. innodb_log_group_home_dir:日志存放的性对路径(相对于$MYSQL_HOME/mysql/data目录,即datadir目录);
          1. 关闭服务器;
          2. 在配置文件中添加此参数,并指定路径;
          3. 启动服务器;
        5. innodb_flush_log_at_trx_commit:根据不同的数据安全级别去设定.
          1. 0:日志缓冲每秒一次的被写入到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务提交不做任何修改;
          2. 1:每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的刷新;
          3. 2:每个事务提交后,日志缓冲被写到日志文件,但不对日志文件做到磁盘操作刷新,对日志文件每秒刷新一次;
          4. 查看此变量:>show variables like ‘innodb_flush_log_at_trx_commit’;
        6. innodb_os_log_written:写入到文件日志的数据量,使用show status查询;
        7. innodb_os_log_fsyncs:写入到磁盘的次数,使用show status查询;
  2. 数据文件:MySql服务器使用磁盘空间有几种方式,主要是在服务器数据目录(datadir)下的数据库目录和文件,主要有以下几点:
    1. 数据库目录:每一个数据库对应一个数据目录(datadir)下的目录,不管你创建哪种类型的表.比如,一个数据库目录可以包含MYISAM引擎的表,INNODB引擎的表或者混合的表;
    2. .frm文件(Table Format Files):包含了表结构的描述信息,每一个表都有一个.frm文件在对应的数据库目录下.它与表使用的哪种引擎没有关系;
    3. .MYD/.MYI:由MYISAM存储引擎在适当的数据库目录下创建的数据库数据文件和索引文件.
    4. INNODB存储引擎有它自己的表空间和日志文件,表空间包含所有使用InnoDB引擎表的数据和索引信息,同样也包括了事务回滚所必须的undo logs.日志文件记录了提交过的事务的信息,用来防止数据丢失.默认情况下,表空间和日志文件保存在数据目录,默认的表空间文件名叫ibdata1,默认的日志文件名叫ib_logfile0和ib_logfile1.(可以为每一个使用InnoDB引擎的表配置一个表空间,这种情况下,InnoDB给指定的表创建表在表数据库目录创建表空间)
      1. 查询表空间模式:>show variables like ‘innodb_file_per_table’ ON:单独表空间,OFF:共享表空间;
      2. 如果要修改这个值的话要关闭服务器,修改配置文件,启动服务这几步;
      3. 如果使用单独表空间模式的话会在相应的数据库目录创建tablename.frm(表结构文件)和tablename.ibd文件(数据和索引文件);
    5. 服务器日志文件和状态文件:这些文件包含服务器上执行过的语句信息,日志被用于复制和数据恢复,获得优化查询性能的信息和误操作信息;
  3. Relication相关文件
  4. 其他小文件

MySQL学习3–MySQL5.1的启动和停止

Mysql启动的4种方法

  1. mysqld
    1. mysqld是MySql服务器进程;
    2. mysqld启动时读取配置文件中的[mysqld]和[server]节点
    3. 我们可以手动的调用mysqld(查看参数:mysqld –verbose –help),但是我们一般只在调试的时候才这么做,如果手动启动的话,错误消息会打印到终端屏幕上而不是错误日志文件中;
    4. 默认读取配置文件的顺序是:
      1. /etc/my.cnf;
      2. /etc/mysql/my.cnf;
      3. /usr/local/mysql/etc/my.cnf;
      4. ~/.my.cnf;
      5. 依次读取后面配置文件中的的项会覆盖掉前面;
    5. 启动方式:$MYSQL_HOME/libexec/mysqld –defaults-file=./my.cnf –user=mysql;
    6. 连接方式:
      1. mysql –defualts-file=./my.cnf
      2. mysql -S /tmp/mysql.sock
  2. mysqld_safe
    1. mysqld_safe读取配置文件的[mysqld],[server]和[mysqld_safe]节点,为了向后兼容,也会读取[safe_mysqld]节点,尽管你应该重命名[mysqld_safe]节点在MySql5.1的安装过程中;
    2. mysqld_safe是一个可以调用mysqld进程的shell脚本,它可以设置错误日志,然后调用并监控mysqld进程,如果mysqld进程异常终止(kill -9 pid)的话,则mysqld_safe可以重新启动它;
    3. 启动方式:$MYSQL_HOME/lib/mysqld_safe –defaults-file=./my.cnf –user=mysql &;
    4. 连接方式:
      1. mysql –defualts-file=./my.cnf
      2. mysql -S /tmp/mysql.sock
  3. mysql.server
    1. MySql的分发版本在Unix上包含了一个叫mysql.server的脚本,它可以用于像Linux和Solaris的OS,以至于能够使用System V-style的方式运行目录来启动和关闭系统服务.它同样可以被用于Mac OS X系统上MySql的开机项;
    2. 存放的目录有:
      1. $MYSQL_HOME/share/mysql/mysql.server
      2. mysql-VERSION/support-files/mysql.server
    3. mysql.server读取配置文件的[mysql.server]和[mysqld]节点,为了向后兼容,它也读取[mysql_server]节点,尽管你应该重命名此节点在使用MySql5.1时;
    4. 它会调用mysqld_safe进程;
    5. 启动方式:
      1. cd $MYSQL_HOME/share/mysql/mysql.server start(stop/restart/reload/force-reload/status)
      2. cp $MYSQL_HOME/share/mysql/mysql.server /etc/rc.d/init.d/mysql;chkconfig –add mysql;service mysql start;
    6. 连接方式:
      1. mysql –defualts-file=./my.cnf
      2. mysql -S /tmp/mysql.sock
  4. mysqld_multi
    1. mysqld_multi是用来管理多个在不同的Unix socket文件和TCP/IP端口监听的mysqld进程的,它可以启动,停止和报告它们当前的状态,MySql Instance Manager是一个具有选择意义的多实例管理服务;
    2. 配置方法:
      1. 创建多实例的数据文件(有几个实例创建几个数据文件目录):>mkdir $MYSQL_HOME/data2;
      2. 修改数据文件目录的访问权限:>chown -R mysql:mysql data2;
      3. 分别初始化各个实例:>mysql_install_db –basedir=$MYSQL_HOME –datadir=$MYSQL_HOME/data2 –user=mysql;(初始化时指定basedir和datadir而不是从配置文件中读取)
      4. 编辑配置文件:添加[mysqld_multi]节点和多个[mysqldxxxx]节点;
      5. 启动实例:>mysqld_multi –defaults-file=./my.cnf start 3306;
      6. 连接方式:
        1. mysql -u root -P 3306 –protocol=tcp;
        2. mysql -S /tmp/mysql3306.sock
      7. 添加有关闭服务权限的用户:>grant shutdown on *.* to “shutdown_user”@”localhost” identified by “pwd” with grant option;(查看授权语句:>show grants for root@localhost;)
      8. 停止服务:>mysqld_multi –defualts-file=./my.cnf stop 3306;
      9. 日志文件存放在:$MYSQL_HOME/share/mysqld_multi.log文件中(mysql5.5中$MYSQL_HOME/data/mysqld_multi.log文件中);
关闭mysql数据库服务器:>mysqladmin shutdown;
查看mysql服务器是否否启动:>mysqladmin ping;
连接MySql
  1. 交互协议
    1. TCP/IP:支持本地连接和远程连接,支持所有的操作系统,除非指定–skip-networking选项;
    2. Unix Socket File:仅支持本地连接,仅支持Unix系统;
    3. Named Pipe:仅支持本地连接,仅支持Windows系统,需要使用-nt的版本(mysql-nt or mysql-max-nt),此方式默认禁止,如果要开启Named Pipe方式连接必须启动-nt版本的服务器并加上–enable-named-pipe选项;
    4. Shared Memory:仅支持本地连接,仅支持Windows系统,默认禁止,如果要开启需要添加–share-memory选项;
  2. 客户端工具
    1. mysql:是一个向服务器发送SQL语句的一般用途的客户端工具,也包含了一些管理的功能;
    2. mysqladmin:是一个帮助管理服务器的管理命令行客户端;
    3. mysqlimport:提供一个LOAD DATA INFILE语句的接口,帮助导入数据;
    4. mysqldump:是一个倾倒数据库和表结构及内容的客户端,主要用于备份和拷贝数据库到其它的机器;
 
 
 
 
 
./my.cnf文件:
[mysqld_multi]
mysqld     = /usr/local/mysql/bin/mysqld_safe     — 启动服务的进程
mysqladmin = /usr/local/mysql/bin/mysqladmin    — 关闭服务的进程
user       = shutdown_user                        — 有关闭服务器权限的用户
password   = pwd                                  — 用户密码
 
[mysqld3306]
port      = 3306                                  — 监听端口号
socket    = /tmp/mysql3306.sock                   — socket文件
pid-file  = /tmp/mysql3306.pid                    — pid文件
basedir   = /usr/local/mysql                      — 实例基目录
datadir   = /usr/local/mysql/data                 — 实例数据文件目录
……                                            — 其它服务器参数

MySQL学习2–Linux下安装Mysql5.5数据库

Linux下安装Mysql5.5数据库
  1. 准备安装工具
    1. cmake:从Mysql5.5以后使用cmake编译,可以从www.cmake.org下载最新版本;
    2. GUN make:操作系统自带;
    3. gcc:操作系统自带;
    4. perl:操作系统自带;
    5. libncurses5-dev(ncurses-devel):运行cmake必须的包,如果没有安装会报错.
  2. 安装cmake:
    1. 解压压缩包:>tar -zxvf cmake-VERSION.tar.gz;
    2. 进入到cmake的解压缩目录,执行./configure命令生成makefile;
    3. 执行>make;make install;命令生成安装软件并安装cmake;
    4. 软件安装到了/usr/local/share/cmake-2.8/目录下,执行文件在/usr/local/bin目录下;
  3. 安装ncurses-devel插件
    1. 在Debian和Ubuntu上的包名是libncurses5-dev;
    2. 在RHEL和其它版本上是ncurses-devel,执行>rpm -ivh ncurses-devel-VERSION.rpm安装;
    3. 如果不安装会出现以下错误;                                                                           
  4. 创建mysql用户:>useradd mysql;                                 
  5. 解压缩mysql5.5的源码包:>tar -zxvf mysql-VERSION.tar.gz;
  6. 进入目录mysql-VERSION目录;
  7. 执行cmake命令生成makefile(MyISAM,MERGE,MEMBER和CSV四种引擎默认静态编译);
  8. 编译文件:>make;make install;mysql的安装目录下生成可执行文件,并自动创建了data文件(可以手动再创建一个logs目录,用来存放生成的日志文件,与数据目录不在同一块磁盘上,减小I/O并发),修改目录权限为mysql:>chown mysql:mysql data;                                      
  9. 拷贝配置文件:>cp ../mysql-VERSION/support-files/my-medium.cnf ./my.cnf                         
  10. 在配置文件下添加目录配置,指定数据文件的位置:                             
  11. 数据库的初始化,主要是数据库的创建,帮助文件的填充,用户文件的填充,执行:>./scripts/mysql_install_db –defaults-file=./my.cnf –user=mysql(在my.cnf配置文件中添加user参数,并且拷贝到/etc目录下就不用再加参数,执行>./scripts/mysql_install_db即可)           
  12. 启动服务器:>.bin/mysqld_safe –-user=mysql &;                         
  13. 修改MYSQL服务器root用户的密码:>./bin/mysqladmin –u root password ‘pwd’;            
  14. 登录:
    1. 如果没有设置root的密码,默认是空密码,使用>./bin/mysql就可以登录;
    2. 如果设置了root密码,则登录时要数据密码验证>./bin/mysql –uroot -p;
    3. 进入数据库后修改用户密码:update user set password=PASSWORD(‘123456′) where user=’root’;
  15. 把mysql添加到环境变量:
    1. 打开~root/.bash_profile文件;                                        
    2. 修改环境变量:>PATH=/usr/local/mysql/bin:$PATH,尽量把mysql的bin目录放在PATH的前面,使用mysql的工具的时候提高优先级,否则可能会使用系统预装的mysql的工具,造成版本不一致的错误,下图不准,修改时注意即可;                                                        
    3. 使环境变量立即生效:>. ./.bash_profile;                        
  16. 把配置文件放到默认读取的路径,并在配置文件中指定启动用户为mysql,添加开机启动:
    1. 拷贝文件到开机启动目录:cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld;
    2. 添加开机启动项:chkconfig –add mysqld;chkconfig mysqld on;
    3. 启动/关闭mysql服务:service mysqld start/stop;
— 编译参数;
/usr/local/bin/cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS:STRING=utf8,gbk \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_TCP_PORT=3306
如果要使用其它字符集,要在安装完成后改变字符集:mysql>set names ‘gb2312’;
charset:gb2312 — collation:gb2312_chinese_cs

MySQL学习1–Linux下安装Mysql5.1数据库

1.创建mysql用户:>useradd mysql
graphic
2.解压缩mysql的源码安装包:>tar –zxvf mysql-VERSION.tar.gz (如果要校验完整性使用md5sum mysql-VERSION.tar.gz 把得到的md5值比较)
graphic
3.创建安装mysql软件的目录:>mkdir /usr/local/mysql
4.进入mysql源码包目录,并编译源码生成makefile文件(查看gcc的版本,使用gcc –version, 查看configure的命令可以进入mysql-VERSION目录使用./configure –help | less命令):
./configure –prefix=/usr/local/mysql \   — 安装路径
–without-debug \                         — 使用非DEBUG方式编译
–enable-thread-safe-client \             — 允许以客户端线程安全方式编译
–enable-assembler \                      — 允许使用汇编字符串处理函数
–enable-profiling \
–with-mysqld-ldflags=-all-static \       — 静态编译,把函数放在执行程序中
–with-client-ldflags=-all-static \
–with-charset=latin1 \                    — 系统默认字符集
–with-extra-charsets=utf8,gbk \          — 编译安装字符集
–with-mysqld-user=mysql \                — 指定运行mysqld的用户
–without-embedded-server \
–with-server-suffix=snda \               — 个性化定制,在系统版本后的后缀
–with-plugins=innobase,partition         —存储引擎
graphic
5.编译文件:>make;make install;mysql的安装目录下生成可执行文件
graphic
6.创建数据文件,并修改目录权限为mysql:mysql:>mkdir data;chown mysql:mysql data
graphic
7.拷贝配置文件:>cp ../mysql-VERSION/support-files/my-medium.cnf ./my.cnf
graphic
8.在配置文件下添加目录配置,指定数据文件的位置
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
graphic
9./var/run文件夹下创建mysqld目录并属于mysql:mysql
>cd /var/run
>mkdir mysqld
>chown mysql:mysql mysqld
graphic
10.数据库的初始化,主要是数据库的创建,帮助文件的填充,用户文件的填充,执行:>./bin/mysql_install_db –defaults-file=./my.cnf –user=mysql
graphic
11.启动服务器:>.bin/mysqld_safe –-user=mysql &
graphic
12.修改MYSQL服务器root用户的密码:>./bin/mysqladmin –u root password ‘pwd’
graphic
13.登录:
    1.如果没有设置root的密码,默认是空密码,使用>./bin/mysql就可以登录
    2.如果设置了root密码,则登录时要数据密码验证>./bin/mysql –uroot -p
graphic
mysql的稳定级别
1.alpha:表明发行包含大量未被彻底测试的新代码
2.beta:意味着该版本功能是完整的,并且所有的新代码被测试了,没有增加重要的新特征,应该没有已知的缺陷.当appha版本至少一个月没有出现报导的致命漏洞,并且没有计划增加导致已经实施的功能不稳定的新功能时,版本从alpha变为beta版本.
3.re:是发布代表,是一个发行了一段时间的beta版本,看起来应该运行正常,只增加了很小的修复.
4.ga:如果没有后缀,这意味着该版本已经在很多地方运行一段时间了,而且没有非平台特性的缺陷报告.
Mysql源码目录,主要包括客户端代码,服务端代码,测试工具和其他库文件
1.BUILD:各种平台的编译脚本,可以用来制作各种平台的二进制版本
2.client:客户端目录(mysql.cc, mysqadmin.ccl)
3.docs:文档目录
4.storage:存储引擎目录,实现了handler抽象接口,主要包含一下目录:
     1.innobase
     2.myisam
     3.myisammrg
     4.heap
     5.cvs
     6.archive
     7.federated
     8.ndb
     9.blackhole
5.mysys:mysql为了实现跨平台对系统库封装
6.sql:数据库主程序目录(sql_insert.cc, sql_update.cc, ..),存储引擎接口(handler.cc, handler.h)