mysql笔记

2014-02-18

1.mysql配置文件目录

 mysql --help|grep my.cnf

                      order of preference, my.cnf, $MYSQL_TCP_PORT,

/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 

2.查找配置文件:find / -name 'my.cnf'

3.参数解析

==================================

[mysqld]

//默认端口

port            = 3306

//socket目录

socket          = /usr/local/mysql/tmp/mysql.sock

//数据库数据文件目录

datadir         = /data/mysql

//解析用IP地址

skip-name-resolve

//为innodb的每个表单独创建表空间

innodb_file_per_table=1

//修改默认存储引擎

default-storage-engine=innodb

//设置保留二进制日志的时间,过期的日志会自动清除

expire_logs_days=20

//二进制日志

log-bin=mysql-bin

//表名都用小写显示,大小写不敏感

lower_case_table_names=1

//最大连接数

max_connections=300

//二进制日志格式

binglog_format=mixed/statement/row

//开启慢查询日志

slow_query_log

//慢查询时间,单位为s

long_query_time=0.5

egg:

root@(none) 10:01>show variables like '%slow%';

+---------------------+----------------------------+

| Variable_name       | Value                      |

+---------------------+----------------------------+

| log_slow_queries    | ON                         |

| slow_launch_time    | 2                          |

| slow_query_log      | ON                         |

| slow_query_log_file | /data/mysql/tech2-slow.log |

+---------------------+----------------------------+

//设置服务端字符集

character-set-server=utf8

//设置客户端的字符集

[client]

default-character-set=utf8

===============================

4.设置环境变量,重启后失效

mysql>set global/session var_name = var_result;

mysql>set session storage_engine=myisam;

5.MYSQL数据文件

//myisam

.frm:与表相关的元数据信息存放在.frm文件中,包括表结构的定义信息等

.myd:为myisam引擎专用,存放myisam表数据

.myi:为myisam引擎专用,存放myisam表的索引相关信息

//innodb

.frm:用来存储表结构定义信息等

.ibd:用来存储数据

注:如果不加innodb_file_per_table=1参数,innodb的数据文件和索引文件都会存放在ibdata1文件

[root@tech2 mysql]# ls -lh /data/mysql/ibdata1 

-rw-rw---- 1 mysql mysql 66M 2月  18 11:01 /data/mysql/ibdata1

6.日志文件

错误日志,二进制日志,查询日志,慢查询日志

###错误日志

默认开启,log_error=hostname.err

记录数据库每次启动和关闭的信息,记录数据库严重的警告和错误信息

###二进制日志

log-bin[=file_name]

root@test  11:20>show variables like 'log_bin';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_bin       | OFF   |

+---------------+-------+

默认情况下时关闭的,三个格式为mixed/statement/row

二进制格式一般选择row,与主从有关时。

//.index用来记录二进制日志的路径

[root@tech2 mysql]# cat mysql-bin.index 

//切换二进制日志文件

mysql>flush logs;

//查看当前的二进制日志文件

root@(none) 11:26>show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000039 |      106 |              |                  |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)


root@(none) 11:26>flush logs;


root@(none) 11:26>show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000040 |      106 |              |                  |

+------------------+----------+--------------+------------------+


//手工删除日志

Syntax:

PURGE { BINARY | MASTER } LOGS

    { TO 'log_name' | BEFORE datetime_expr }

egg:

purge binary logs to 'mysql-bin.000044';

purge binary logs before '2014-01-01 00:00:00';

###查询日志

general_log=1,0为不开启,默认不开启查询日志,会影响MYSQL性能。


###慢查询日志

slow_query_log

long_query_time=0.5


###重做日志文件

//日志文件大小,默认大小为5MB

innodb_log_file_size=64M

//日志文件个数,默认为2个

innodb_log_files_in_group=3

//存储路径

innodb_log_group_home_dir

//修改重做日志文件大小的步骤

1).停止数据库

2).备份重做日志

3).设置参数值

4).删除之前重组日志

5).启动数据库

ERROR! MySQL server PID file could not be found!

Starting MySQL...... ERROR! The server quit without updating PID file (/data/dbdata/mycentos1.pid).

解析:关闭mysql,/data/dbdata/mycentos1.pid文件就不存在(查看错误日志文件)

**********************************

mysql backup ang recovery

###备份

1.mysqldump

//全备份

mysqldump -uroot -p322815 --all-databases --events >full_db_$(date +%Y%m%d%H%M%S).sql

或:

mysqldump -uroot -p322815 --all-databases --events  > full_db_`date +%Y%d%m%H%M%S'.sql

//备份单个数据库

mysqldump -uroot -p322815 --databases employees >employeees_$(date +%Y%m%d%H%M%S).sql

//备份某个表

mysqldump -uroot -p322815 employees titles > titles_$(date +%Y%d%m%H%M%S ).sql

--events:备份事件 

--routines:备份存储过程和函数

--single-transaction:保持备份的一致性

--lock-tables:用于myisam,在备份时,依次锁住每个架构下的所有表

--master-data:value值为1,转存CHANGER MASTER语句,value为2时,CHANGER MASTER被注释,默认情况系为空。

--flush-logs:在备份之前切换日志 

egg:

mysqldump -uroot -p322815 --single-transaction --master-data=2  --routines --events --flush-logs --databases employees > employees_$(date +%Y%d%m%H%M%S).sql

**补充:

事务四个特性:原子性(Atomicity)一致性(Consistency) 隔离性(Isolation)持久性(Durability)

2.select...into outfile

 egg1:

mysql>select * into outfile '/data/backup/1.sql' fields terminated by ',' enclosed by '"' lines terminated by '\n'  from titles;

 egg2:

mysql>select * into outfile '/data/backup/2.sql' fields terminated by ',' enclosed by '"' lines terminated by '\n' from titles where title='Senior Engineer';

错误:ERROR 1 (HY000): Can't create/write to file '/data/backup/2.sql' (Errcode: 13)

方法:chmod 757 /data/backup/

3.xtrabackup

##数据还原

1.mysql 

//数据库还原

mysql -uroot -pmysql < employees_20141802165309.sql 

//还原表,需要指定数据库

[root@tech2 backup]# mysql -uroot -pmysql --database test < tuge.sql

2.load data infile

mysql>load data infile '/data/backup/2.sql' into table titles  fields terminated by ',' enclosed by '"' lines terminated by '\n';

补充5.5版本:

误删掉mysql所有数据库的解决方法:

停止mysql进程;

重新初始化数据库文件:/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/

重启服务。

_________________________________________________________________________

2014-02-19

1.mysqlbinlog

--start-datetime:开始时间点

--stop-datetime:结束时间点

--start-position:开始位置

--stop-position:结束位置

###基本语法

mysqlbinlog mysqlbinglog_name > binglog.sql

基于时间导出数据

[root@tech2 mysql]# mysqlbinlog --start-datetime='2014-02-18 13:01:01' mysql-bin.000047 > /data/backup/bin1.sql

基于写入位置导出数据

[root@tech2 mysql]# mysqlbinlog --start-position=232578479 mysql-bin.000047 > /data/backup/bin2.sql

//自动提交事物

root@(none) 08:48>show variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | ON    |

+---------------+-------+

1 row in set (0.00 sec)

###mysql命令

[root@tech2]# mysql -uroot -pmysql -e "use test;select count(*) from tuge;"

+----------+

| count(*) |

+----------+

|       58 |

+----------+

[root@tech2]# mysql -uroot -pmysql -s -e "use test;select count(*) from tuge;"

count(*)

58

[root@tech2]# mysql -uroot -pmysql -ss -e "use test;select count(*) from tuge;"

58

###mysqladmin命令

//监控MYSQL性能

[root@tech2 backup]# mysqladmin  -uroot -pmysql status --sleep=1 --count=20;

//查看活动的连接

[root@tech2 backup]# mysqladmin  -uroot -pmysql processlist;

//KILL连接进程

[root@tech2 backup]# mysqladmin  -uroot -pmysql kill id_number;

_________________________________________

2014-02-20

1.mysql支持的分区:RANGE/LIST/HASH/KEY

RANGE:基于属于一个给定连续区间的列值,把多行分配给分区。

LIST:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

HASH:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。

KEY:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

//

range分区:行数据基于属于一个给定连续区间的列值被放入分区,mysql5.5开始支持range columns的分区。

list分区:分区面向的是离散的值,mysql5.5支持list columns。

hash分区:根据用户自定义的表达式的返回值来进行分区,返回值不能为负数。

key分区:根据MYSQL数据库提供的哈希函数来进行分区。

谨记:无论使用何种类型的分区,分区总是在创建时就自动的顺序编号,且从0开始记录;

      只有RANGE和LIST支持子分区,但是子分区内只能使用HASH和KEY分区。

2.基本语法

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

    (create_definition,...)

    [table_options]

    [partition_options]


partition_options:

    PARTITION BY

        { [LINEAR] HASH(expr)

        | [LINEAR] KEY [ALGORITHM={1|2}] (column_list)

        | RANGE{(expr) | COLUMNS(column_list)}

        | LIST{(expr) | COLUMNS(column_list)} }

    [PARTITIONS num]

    [SUBPARTITION BY

        { [LINEAR] HASH(expr)

        | [LINEAR] KEY [ALGORITHM={1|2}] (column_list) }

      [SUBPARTITIONS num]

    ]

    [(partition_definition [, partition_definition] ...)]

3.分区限制

(1)创建任何分区,如果表中存在主键或唯一索引时,分区列必须是唯一索引的一个组成部分。

mysql> create table part1

(col1 int not null,

col2 varchar(50) not null,

col3 int not null,

col4 int not null,

unique key(col1,col2)) 

partition by hash(col3) 

partitions 4;

ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function

mysql>create table part1(col1 int not null,col2 varchar(50) not null,col3 int not null,col4 int not null,unique key(col1,col2,col3,col4)) partition by hash(col3) partitions 4;

(2)唯一索引可以为空值,并且分区列只要是唯一索引的一个组成部分,不需要整个唯一索引都是分区列。

create table part2

(col1 int not null,

col2 varchar(50) not null,

col3 int not null,

col4 int,

unique key(col1,col2,col3,col4)) 

partition by hash(col3)

partitions 5;

(3)如果表中没有指定主键,唯一索引,可以指定任何一列为分区列。

create table part3(col1 int not null,col2 varchar(50) not null,col3 int not null,col4 int not null) partition by hash(col3) partitions 5; 

4.创建各种分区

1)RANGE分区

CREATE TABLE titles (

    emp_no      INT NOT NULL,

    title       VARCHAR(50)     NOT NULL,

    from_date   DATE            NOT NULL,

    to_date     DATE,

    KEY         (emp_no),

    PRIMARY KEY (emp_no,title, from_date)

) partition by range columns(from_date)

(partition p01 values less than ('1985-12-31'),

partition p02 values less than ('1986-12-31'),

partition p03 values less than ('1987-12-31'),

partition p04 values less than ('1988-12-31'),

partition p05 values less than ('1989-12-31'),

partition p06 values less than ('1990-12-31'),

partition p07 values less than ('1991-12-31'),

partition p08 values less than ('1992-12-31'),

partition p09 values less than ('1993-12-31'),

partition p10 values less than ('1994-12-31'),

partition p11 values less than ('1995-12-31'),

partition p12 values less than ('1996-12-31'),

partition p13 values less than ('1997-12-31'),

partition p14 values less than ('1998-12-31'),

partition p15 values less than ('1999-12-31'),

partition p16 values less than ('2000-12-31'),

partition p17 values less than ('2001-12-31'),

partition p18 values less than ('2002-12-31'),

partition p19 values less than ('3000-12-31')

);

//查看执行计划

explain partitions select * from titles where from_date < '1985-12-31';

2)LIST分区

drop table titles;

CREATE TABLE titles (

    emp_no      INT NOT NULL,

    title       VARCHAR(50)     NOT NULL,

    from_date   DATE            NOT NULL,

    to_date     DATE,

    KEY         (emp_no),

    PRIMARY KEY (emp_no,title, from_date)

) partition by list columns(title)

(

partition p0 values in ('Assistant Engineer'),

partition p1 values in ('Engineer'),

partition p2 values in ('Manager'),

partition p3 values in ('Senior Engineer'),

partition p4 values in ('Senior Staff'),

partition p5 values in ('Staff'),

partition p6 values in ('Technique Leader')

);

//查看执行计划

explain partitions select * from titles where title='manger';

3)HASH分区

CREATE TABLE titles (

    emp_no      INT NOT NULL,

    title       VARCHAR(50)     NOT NULL,

    from_date   DATE            NOT NULL,

    to_date     DATE,

    KEY         (emp_no),

    PRIMARY KEY (emp_no,title, from_date)

) partition by hash(emp_no)

partitions 4;

//查看执行计划

explain partitions select * from titles where emp_no=499999;

4)KEY分区

CREATE TABLE titles (

    emp_no      INT NOT NULL,

    title       VARCHAR(50)     NOT NULL,

    from_date   DATE            NOT NULL,

    to_date     DATE,

    KEY         (emp_no),

    PRIMARY KEY (emp_no,title, from_date)

) partition by key(emp_no)

partitions 4;

//查看执行计划

explain partitions select * from titles where emp_no = 499999;

=====================下午===================

1.innodb逻辑存储结构

共享表空间:ibdata1

表空间由段(segment),区(extend),页(page)

区由连续的页组成,区的最小单位为1MB,INNODB存储引擎的页大小为16K,即一个区由由64个连续的页组成。

常见的段有数据段,索引段,回滚端(undo段),redo段

[root@tech2 page_mysql]# ./py_innodb_page_info.py /data/mysql/ibdata1 

Total number of page: 4224:

Insert Buffer Bitmap: 1

System Page: 4

Transaction system Page: 1

Freshly Allocated Page: 507

Undo Log Page: 3209

File Segment inode: 4

B-tree Node: 494

File Space Header: 1

Uncompressed BLOB Page: 3

//工具./py_innodb_page_info.py 代码

[root@tech2 page_mysql]# cat include.py

#encoding=utf-8

INNODB_PAGE_SIZE = 16*1024*1024


# Start of the data on the page

FIL_PAGE_DATA = 38



FIL_PAGE_OFFSET = 4 # page offset inside space

FIL_PAGE_TYPE = 24 # File page type


# Types of an undo log segment */

TRX_UNDO_INSERT = 1

TRX_UNDO_UPDATE = 2


# On a page of any file segment, data may be put starting from this offset

FSEG_PAGE_DATA = FIL_PAGE_DATA


# The offset of the undo log page header on pages of the undo log

TRX_UNDO_PAGE_HDR = FSEG_PAGE_DATA


PAGE_LEVEL = 26    #level of the node in an index tree; the leaf level is the level 0 */

               

innodb_page_type={

    '0000':u'Freshly Allocated Page',

    '0002':u'Undo Log Page',

    '0003':u'File Segment inode',

    '0004':u'Insert Buffer Free List',

    '0005':u'Insert Buffer Bitmap',

    '0006':u'System Page',

    '0007':u'Transaction system Page',

    '0008':u'File Space Header',

    '0009':u'扩展描述页',

    '000a':u'Uncompressed BLOB Page',

    '000b':u'1st compressed BLOB Page',

    '000c':u'Subsequent compressed BLOB Page',

    '45bf':u'B-tree Node'

    }

   

innodb_page_direction={

    '0000': 'Unknown(0x0000)',

    '0001': 'Page Left',

    '0002': 'Page Right',

    '0003': 'Page Same Rec',

    '0004': 'Page Same Page',

    '0005': 'Page No Direction',

    'ffff': 'Unkown2(0xffff)'

}


INNODB_PAGE_SIZE=1024*16 # InnoDB Page 16K

####

[root@tech2 page_mysql]# cat mylib.py

#encoding=utf-8

import os

import include

from include import *


TABLESPACE_NAME='D:\\mysql_data\\test\\t.ibd'

VARIABLE_FIELD_COUNT = 1

NULL_FIELD_COUNT = 0


class myargv(object):

    def __init__(self, argv):

        self.argv = argv

        self.parms = {}

        self.tablespace = ''

   

    def parse_cmdline(self):

        argv = self.argv

        if len(argv) == 1:

            print 'Usage: python py_innodb_page_info.py [OPTIONS] tablespace_file'

            print 'For more options, use python py_innodb_page_info.py -h'

            return 0

        while argv:

            if argv[0][0] == '-':

                if argv[0][1] == 'h':

                    self.parms[argv[0]] = ''

                    argv = argv[1:]

                    break

                if argv[0][1] == 'v':

                    self.parms[argv[0]] = ''

                    argv = argv[1:]           

                else:

                    self.parms[argv[0]] = argv[1]

                    argv = argv[2:]

            else:

                self.tablespace = argv[0]

                argv = argv[1:]

        if self.parms.has_key('-h'):

            print 'Get InnoDB Page Info'

            print 'Usage: python py_innodb_page_info.py [OPTIONS] tablespace_file\n'

            print 'The following options may be given as the first argument:'

            print '-h        help '

            print '-o output put the result to file'

            print '-t number thread to anayle the tablespace file'

            print '-v        verbose mode'

            return 0

        return 1

       

def mach_read_from_n(page,start_offset,length):

    ret = page[start_offset:start_offset+length]

    return ret.encode('hex')

   

def get_innodb_page_type(myargv):

    f=file(myargv.tablespace,'rb')

    fsize = os.path.getsize(f.name)/INNODB_PAGE_SIZE

    ret = {}

    for i in range(fsize):

        page = f.read(INNODB_PAGE_SIZE)

        page_offset = mach_read_from_n(page,FIL_PAGE_OFFSET,4)

        page_type = mach_read_from_n(page,FIL_PAGE_TYPE,2)

        if myargv.parms.has_key('-v'):

            if page_type == '45bf':

                page_level = mach_read_from_n(page,FIL_PAGE_DATA+PAGE_LEVEL,2)

                print "page offset %s, page type <%s>, page level <%s>"%(page_offset,innodb_page_type[page_type],page_level)

            else:

                print "page offset %s, page type <%s>"%(page_offset,innodb_page_type[page_type])

        if not ret.has_key(page_type):

            ret[page_type] = 1

        else:

            ret[page_type] = ret[page_type] + 1

    print "Total number of page: %d:"%fsize

    for type in ret:

        print "%s: %s"%(innodb_page_type[type],ret[type])

###

[root@tech2 page_mysql]# cat py_innodb_page_info.py 

#! /usr/bin/env python

#encoding=utf-8

import mylib

from sys import argv

from mylib import myargv


if __name__ == '__main__':

    myargv = myargv(argv)

    if myargv.parse_cmdline() == 0:

        pass

    else:

        mylib.get_innodb_page_type(myargv)


####


//查看innodb存储引擎状态:

root@(none) 14:25>show engine innodb status\G;


1.//需要提交后才能插入记录

#关闭自动提交

set autocommit=0;

#插入数据

insert into tuge select 'come on';

#另一台查找:没有插入

select * from tuge;

#提交

commit;

#另一台查找:显示插入信息

select * from tuge;

2.//直接插入记录

set autocommit=1;

insert into tuge select 'he';

#查找:显示信息

select * from tuge;

3.//提交后插入记录

set autocommit=1;

start transaction;

insert into tuge select 'haha';

#另一台查找:没有插入

select * from tuge;

commit;

4.//回滚过后提交没有插入任何记录

set autocommit=1;

start transaction;

insert into tuge select 'hahe';

#回滚

rollback;

select * from tuge;

commit;


//测试事务提交

create table test_load(a int,b char(80)) engine=innodb default charset=utf8;

1.单个提交

delimiter $$

create procedure pro_load1(v_count int unsigned)

begin

declare s int unsigned default 1;

declare c char(80) default repeat('a',80);

while s < v_count 

do

insert into test_load select null,c;

set s = s+1;

commit;

end while;

end$$

delimiter ;

#调用:call pro_load1(10000);//(1 min 5.65 sec)

2.批量提交

delimiter $$

create procedure pro_load2(v_count int unsigned)

begin

declare s int unsigned default 1;

declare c char(80) default repeat('a',80);

start transaction;

while s < v_count 

do

insert into test_load select null,c;

set s = s+1;

end while;

commit;

end$$

delimiter ;

#调用:call pro_load2(10000);//(0.46 sec)

//设置事务保存点

SAVEPOINT identifier

ROLLBACK [WORK] TO [SAVEPOINT] identifier

EGG:

root@test  16:13>start transaction;

root@test  16:13>savepoint t1;

root@test  16:13>insert into tuge select 'huhu';

root@test  16:14>savepoint t2;

root@test  16:14>insert into tuge select 'lala';

root@test  16:16>rollback to savepoint t1;

扩展:事务的特性(ACID特性) 

A:原子性(Atomicity) 

事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。 

B:一致性(Consistency) 

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 

C:隔离性(Isolation) 

一个事务的执行不能被其他事务干扰。 

D:持续性/永久性(Durability) 

一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。 

注:事务是恢复和并发控制的基本单位。

//锁

flush table with read lock;

insert into tuge select 'lala';

ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock

#解锁

unlock table;

//数据文件的存放路径

innodb_data_home_dir = /ibdata

#innodb_data_file_path=ibdata1:10M:autoextend

innodb_data_file_path=ibdata1:10M:autoextend:max:500M


#buffer pool

innodb_buffer_pool_size=256M

扩展:

myisam表级锁

innodb行级锁

共享锁【S锁】

又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

排他锁【X锁】

又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

_______________________________________________________________

2014-02-21

###54.222 config

default-storage-engine=myisam

log-slave-update=1

log-bin=ms-mysql-bin

#当表带engine=innodb,跳过innodb支持,中间层自动使用引擎blackhole

skip-innodb


--------------------------------------|54.226(innodb)

54.220(master)---54.222(blackhole)----|54.227(innodb)

--------------------------------------|54.228(innodb)


导出54.220所有的表结构,修改为blackhole,导入54.222


PERL软件的安装

wget:http://www.percona.com/redir/downloads/percona-toolkit/2.2.6/percona-toolkit-2.2.6.tar.gz

1.Makefile.PL-->保证PERL的安装

2.Installing

----------


To install all tools, run:


   perl Makefile.PL  --->报错: yum install perl-CPAN.x86_64

                                cpan DBD::mysql

                                cpan YAML


   make

   make test

   make install

-------------------

CPAN装不了:安装perl-DBD-MySQL.x86_64 

//删除过后释放表空间,仅删除释放不了,必须做如下操作:

pt-online-schema-change --user=root --p --host=10.10.54.57 --alter "ENGINE=InnoDB" D=employees,t=salaries --execute

##错误:

Can't locate Time/HiRes.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/bin/pt-online-schema-change line 3641.

BEGIN failed--compilation aborted at /usr/local/bin/pt-online-schema-change line 3641.

##解决方法:

安装:perl-Time-HiRes.x86_64 

yum install perl-DBD-MySQL

//PERL模块:

1)用CPAN安装;

2)用RPM安装软件包;

3)下载并安装。

========================下午===========================

//复制:

1.在主库上开启二进制日志,把数据更改记录到二进制日志(binary log)中。

 mysql会按照事务提交的顺序而非每条语句的执行顺序来记录二进制日志,在记录二进制日志后,主库会告诉存储引擎可以提交事务。

2.从库将主库上的二进制日志复制到自己的中继日志(relay log)中

 从库会启动一个I/O线程,I/O线程跟主库建立一个客户端连接,然后主库杀那个会启动一个 binary dump线程,用来读取主库上的二进制日志的事件。不会对事件进行轮询,如果该线程同步上主库,进入休眠状态,直到主库发送信号量通知其有新的事件产生才会被唤醒。

3.从库读取中继日志的事件,将其重放到从库上执行,从而实现从库数据的更新。

//复制解决的问题:

1.数据库分布:可以随意停止或开始复制,并在不同的地理位置来分布数据备份,尽量保持网路环境的稳定,降低延迟连接。

负载均衡:在读取操作分布到多台从服务器上,实现对密集型应用的优化。

备份:对备份来说是技术上的补充。

高可用和故障切换:避免MYSQL单点故障,设计良好的故障切换能够缩短宕机时间。

//复制的方式:

二进制日志:statement/row/mixed

基于row复制是从mysql5.1版本加入,两种方式都是通过在主库上记录二进制日志,在从库重放日志的方式来实现异步的数据复制。大的语句可能导致从库产生几秒,甚至几分钟的延迟。

mysql5.5复制配置

1.规划网络和主从机器

master:10.10.54.57

slave:10.10.54.56

2.master config

======================

 log-bin=master-bin

server-id=1

===================

3.slave config

==================

log-bin=slave-bin

server-id=10

===================

注意:slave的server-id一定要大于master的server-id.

4.在master上创建一个复制用户并授予权限

grant replication slave on *.* to 'repl'@'10.10.54.%' identified by 'slave';

5.在master上查看二进制日志文件和postion位置

mysql>show master status;

+-------------------+----------+--------------+------------------+

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------+----------+--------------+------------------+

| master-bin.000001 |      107 |              |                  |

+-------------------+----------+--------------+------------------+

获取帮助

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=107;

6.备份master上的数据,把备份master数据还原到从库上

mysqldump -uroot -p --master-data=2 --single-transaction --flush-logs --database employees >s.sql

mysql -uroot -p -h10.10.54.56 <s.sql

7.在slave上change master操作

mysql>change master to master_host='10.10.54.222',

      master_user='repl',master_password='slave',

      master_log_file='master-bin.000001',master_log_pos=107;

8.在slave上启动slave

mysql>start slave

9.查看slave状态

确定slave上I/O线程和SQL线程状态为YES

root@(none) 15:28>show slave status\G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 10.10.54.222

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: master-bin.000001

          Read_Master_Log_Pos: 107

               Relay_Log_File: s01-relay-bin.000002

                Relay_Log_Pos: 254

        Relay_Master_Log_File: master-bin.000001

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes


//stop io_thread

mysql> STOP SLAVE IO_THREAD;

mysql> STOP SLAVE SQL_THREAD;

查看权限:show grants for'xiao'@'10.10.54.%';

重置:reset master;(先停止slave)

重置会删除所有的二进制日志,生产环境下一定要记得备份。

//单独停止I/O线程

mysql> STOP SLAVE IO_THREAD;

mysql> STOP SLAVE SQL_THREAD;

______________________________________________________________________

2014-02-25

mysql NDB

一.原理

mysql cluster基于NDB CLUSTER存储引擎的完整的分布式数据库系统。MYSQL CLUSTER是一个share noting架构,各个mysql server之间并不共享任何数据。mysql cluster实际上是在无共享存储设备上实现的一种完全分布式数据库系统。现在版本的MYSQL CLUSTER可以做到将所有索引装载在内存中,实际的数据可以不用全部装载到内存中。

二.mysql cluster的组成

(1)sql node:负责数据库存储层之上的的所有事情,比如连接管理,query优化和响应,cache管理。SQL节点是使用命令mysqld –ndbcluster启动的,或将ndbcluster添加到my.cnf后使用mysqld启动。

(2)data node:实现底层的数据存储功能,保存CLUSTER的数据,每个data节点保存完整数据的一个fragment,一般来说ndb节点被组成一个一个的ndb group,一个ndb group实际上就是一组存有完全相同的物理数据的NDB节点群。数据节点的配置参数在管理节点的config.ini中配置。NoOfreplicas参数指定每一份数据被冗余存储在所有节点上面的份数,一般至少设置为2.数据节点是用命令ndbd启动的。

(3)managerment node:负责管理整个集群中的各个节点的管理工作,包括集群的配置,启动并停止节点,运行备份,对各个节点进行常规维护等。MGM节点是用命令ndb_mgmd启动的,在启动其他节点之前首先启动这类节点。

mysql cluster启动顺序:

management node ---> data node----->sql node

三.mysql cluster network 

配置步骤:

1.网络规划

managerment node :10.10.54.57

data node:10.54.56/58

sql node:10.10.54.56/58

2.停止各个节点的mysql服务

/etc/init.d/mysqld stop

##避免对mysql的破坏,需移动文件

mv /usr/local/mysql /usr/local/mysql_bak

3.管理节点安装配置

(1)安装mysql-cluster

##解压缩文件

tar xvf mysql-cluster-gpl-7.2.15-linux2.6-x86_64.tar.gz

##移动文件到指定目录 

mv mysql-cluster-gpl-7.2.15-linux2.6-x86_64 /usr/local/mysql

##改变文件级文件所有者:

chown mysql.mysql -R /usr/local/mysql 

chown mysql.mysql /data/ndb/ -R

(2)初始化数据库

/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --user=mysql --datadir=/data/ndb

##错误:

/usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

安装:yum list |grep libaio

     yum install libaio-devel.x86_64 

##复制ndb节点管理命令到本地,方便使用

cd /usr/local/mysql/bin

[root@xiao57 bin]# cp ndb_mgm* /usr/local/bin

(3)修改mysql主配置文件(可以不做这步,做过管理节点也可以成为SQL节点)

vim /etc/my.cnf

===============================

[mysql_cluster]

ndb-connectstring=10.10.54.57

[mysqld]

# 数据库存放目录

datadir         = /data/ndb

ndbcluster

ndb-connectstring=10.10.54.57

=============================

##修改启动文件

vim /etc/init.d/mysqld

====================

datadir=/data/ndb

====================

##重启

/etc/init.d/mysqld restart

(4)创建mysql集群配置文件

[root@xiao57 bin]# mkdir /etc/ndb

[root@xiao57 bin]# vim /etc/ndb/config.ini

========================================

[NDBD DEFAULT]

#定义在Cluster环境中相同数据的份数,最大为4

NoOfReplicas=2

#分配的数据内存大小,根据本机服务器内存适量来分配,否则会连接失败

DataMemory=256M

#设定用于存放索引(非主键)数据的内存段大小

IndexMemory=64M

[TCP DEFAULT]

portnumber=2202

[NDB_MGMD]

nodeid=1

hostname=10.10.54.57

datadir=/data/ndb

[NDBD]

nodeid=2

hostname=10.10.54.56

datadir=/data/ndb

backupdatadir=/data/backup

[NDBD]

nodeid=3

hostname=10.10.54.58

datadir=/data/ndb

backupdatadir=/data/backup

[MYSQLD]

nodeid=10

hostname=10.10.54.56

[MYSQLD]

nodeid=11

hostname=10.10.54.58

========================================

##改变文件所有者

chown mysql.mysql  /etc/ndb/config.ini

4.配置两台数据节点和SQL节点:配置相同

(1)安装mysql-cluster

##解压缩文件

tar xvf mysql-cluster-gpl-7.2.15-linux2.6-x86_64.tar.gz

##移动文件到指定目录 

mv mysql-cluster-gpl-7.2.15-linux2.6-x86_64 /usr/local/mysql

##改变文件级文件所有者:

chown mysql.mysql -R /usr/local/mysql 

(2)初始化数据库

/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --user=mysql --datadir=/data/ndb

##错误:

/usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

安装:yum list |grep libaio

     yum install libaio-devel.x86_64 

##复制ndb节点管理命令到本地,方便使用

cd /usr/local/mysql/bin

[root@xiao57 bin]# cp ndb_mgm* /usr/local/bin

(3)修改mysql配置文件

vim /etc/my.cnf

===============================

[mysql_cluster]

ndb-connectstring=10.10.54.57

[mysqld]

datadir         = /data/ndb

#运行NDB存储引擎

ndbcluster

#mysql cluster 管理节点IP

ndb-connectstring=10.10.54.57

=============================

##修改启动文件

vim /etc/init.d/mysqld

====================

datadir=/data/ndb

====================

##重启

/etc/init.d/mysqld restart

5.测试(必须关闭每台机器上的iptables&&selinux)

(1)启动管理节点

[root@xiao57 ~]# cd /usr/local/bin/

[root@xiao57 bin]# ndb_mgmd -f /etc/ndb/config.ini --initial

MySQL Cluster Management Server mysql-5.5.35 ndb-7.2.15

#默认连接端口1186,启动成功

[root@xiao57 bin]# netstat -ntlup|grep 1186

tcp        0      0 0.0.0.0:1186                0.0.0.0:*                   LISTEN      2940/ndb_mgmd       

[root@xiao57 bin]# ndb_mgm

-- NDB Cluster -- Management Client --

ndb_mgm> show

(2)启动两台数据节点和SQL节点

数据节点: /usr/local/mysql/bin/ndbd --initial --ndb-connectstring=10.10.54.57

2014-02-26 11:56:31 [ndbd] INFO     -- Angel connected to '10.10.54.57:1186'

2014-02-26 11:56:31 [ndbd] INFO     -- Angel allocated nodeid: 2

SQL节点:/etc/init.d/mysqld start

(3)查看集群状态

#显示管理节点和数据节点则配置成功

ndb_mgm -e show 

##出错:

所有节点正常启动,但是显示一直连接不上

ndb_mgm> show

Connected to Management Server at: 10.10.54.57:1186

Cluster Configuration

---------------------

[ndbd(NDB)] 2 node(s)

id=2 (not connected, accepting connect from 10.10.54.56)

id=3 (not connected, accepting connect from 10.10.54.58)


[ndb_mgmd(MGM)] 1 node(s)

id=1 @10.10.54.57  (mysql-5.5.35 ndb-7.2.15)


[mysqld(API)] 5 node(s)

id=10 (not connected, accepting connect from 10.10.54.56)

id=11 (not connected, accepting connect from 10.10.54.58)

id=12 (not connected, accepting connect from any host)

id=13 (not connected, accepting connect from any host)

id=14 (not connected, accepting connect from any host)

//查看日志:

[root@xiao56 ndb]# vim ndb_2_out.log 

[ndbd] ERROR    -- ndbd_malloc_impl.cpp:619:grow(155414, 2061) not using 64Mb - Unable to use due to bitmap pages missaligned!!

解决方法:把DataMemory和IndexMemory的值调小

DataMemory=256M

IndexMemory=64M

#一个NDB节点能存放的数据量是会受到DataMemory和IndexMemory两个参数设置的约束,两者任何一个达到限制数量后,都无法再增加能存储的数据量。如果继续存入数据系统会报错“table is full”。

(4)在数据节点上创建一个数据库验证是否同步

mysql -u root -p

Mysql>create database tt;

Mysql>use tt;

#指定数据库表的引擎为NDB,否则同步失败

Mysql>create table abc (id int) engine=ndbcluster;

Mysql>insert into abc values(1),(2);

Mysql>select * from abc;

#此时看两个数据是否数据一致,如果一致说明集群已经成功!

注意事项:

1.在建表的时候一定要用ENGINE=NDB或ENGINE=NDBCLUSTER指定使用NDB集群存储引擎,或用ALTER TABLE选项更改表的存储引擎。

2.NDB表必须有一个主键,因此创建表的时候必须定义主键,否则NDB存储引擎将自动生成隐含的主键。

3.Sql节点的用户权限表仍然采用MYISAM存储引擎保存的,所以在一个Sql节点创建的MySql用户只能访问这个节点,如果要用同样的用户访问别的Sql节点,需要在对应的Sql节点追加用户。

4.--initial:第一次启动时加上,其它时候不要加,不然会数据清空,除非是在备份、恢复或配置变化后重启时。

##扩展:

管理和维护命令

关闭mysql集群:ndb_mgm -e shutdown

重启mysql集群:ndb_mgmd -f /etc/ndb/config.ini

重启数据节点:/usr/local/mysql/bin/ndbd

启动SQL节点:/usr/local/mysql/bin/mysqld_safe --user=mysql & 或 service mysqld restart

查看mysql状态:ndb_mgm -e show

启动顺序:

管理节点 -> 数据节点 -> SQL节点

关闭顺序:

SQL节点 -> 数据节点 -> 管理节点

-----改变节点生效操作步骤-----

关闭服务:ndb_mgm -e shutdown

删除文件:rm /usr/local/mysql/mysql-cluster/ndb_1_config.bin.1 

重启mysql集群:ndb_mgmd -f /etc/ndb/config.ini

--------启动数据节点失败:no free node id---------

解决方法:杀掉NDB进程

——————————————————————————————————————————————————————————————————————

2014-02-26

DataMemory:配置在[NDBD DEFAULT]中,用来存储数据和ordered index.


root@t1 14:32>show create table sw1;

+-------+------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                         |

+-------+------------------------------------------------------------------------------------------------------+

| sw1   | CREATE TABLE `sw1` (

  `name` varchar(13800) DEFAULT NULL

) ENGINE=ndbcluster DEFAULT CHARSET=latin1 |

+-------+------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)


root@t1 14:32>insert into sw1 select repeat('y',13800);

Query OK, 1 row affected (0.00 sec)

Records: 1  Duplicates: 0  Warnings: 0


root@t1 14:34>select length(name) from sw1;

+--------------+

| length(name) |

+--------------+

|        13800 |

+--------------+

1 row in set (0.03 sec)

root@t1 14:38>create table sw3(name varchar(4500)) engine=ndbcluster charset=utf8;


//不同的字符编码支持的字符长度不一样

root@t1 14:38>create table sw3(name varchar(4500)) engine=ndbcluster charset=utf8;

//ndb_desc用来分析表的详细信息

[root@s01 support-files]# ndb_desc  -d t1 sw4

//每种存储引擎支持的索引类型

存储引擎            索引

MyISAM            BTREE

InnoDB            BTREE

MEMORY/HEAP    HASH, BTREE

NDB            BTREE, HASH (see note in text)

IndexMemory:配置在[NDBD DEFAULT]中,用来存储hash索引,包括主键索引,唯一索引和唯一约束。

_________________________________________________

2014-02-27

备份:

START BACKUP [<backup id>] [NOWAIT | WAIT STARTED | WAIT COMPLETED]

egg:ndb_mgm -e "start backup"

##创建索引:

mysql>create index ind_name on sw4(name);

语法:ndb_drop_index -c "node management" tablename indexname -d dbname 

egg:ndb_drop_index -c 10.10.54.222 sw4 idx_name -d t1 

注意:只有INNODB支持外键。

NDB存储引擎原则上是不支持外键的。但在建表时,可以加入外键及外键约束,不会提示错误。但我们去查看表结构时,被设置为外键的字段的值会自动变更为MUL。

//NDB不支持的特性

1.不支持外键约束

2.复制仅支持binlog-format=row

3.不支持索引前缀的创建方式

root@t1 09:05>create index idx_name1 on sw4(name(10));

ERROR 1296 (HY000): Got error 4243 'Index not found' from NDBCLUSTER

//常用命令

###统计行记录 

语法:ndb_select_count [-c connect_string] -ddb_name tbl_name[, tbl_name2[, ...]]

例子:ndb_select_count -c 10.10.54.222 -dt1 sw4 sw1 sw2

________________________________________________________________

2014-02-28

1.安装pssh

##下载

wget https://parallel-ssh.googlecode.com/files/pssh-2.3.1.tar.gz

##解压

tar xvf pssh-2.3.1.tar.gz 

#编译

[root@xiao59 pssh-2.3.1]# vim INSTALL 

[root@xiao59 pssh-2.3.1]# python setup.py install

2.安装python模块用pip命令安装

//easy_install 

[root@s03 pssh-2.3.1]# yum install python-setuptools.noarch

[root@s03 pssh-2.3.1]# easy_install pip

3.PIP用法

##下载软件包

Install a package from PyPI:

$ pip install SomePackage

  [...]

  Successfully installed SomePackage

##查看下载过的软件包

Show what files were installed:

$ pip show --files SomePackage

  Name: SomePackage

  Version: 1.0

  Location: /my/env/lib/pythonx.x/site-packages

  Files:

   ../somepackage/__init__.py

   [...]

##

List what packages are outdated:

$ pip list --outdated

  SomePackage (Current: 1.0 Latest: 2.0)


Upgrade a package:

$ pip install --upgrade SomePackage

  [...]

  Found existing installation: SomePackage 1.0

  Uninstalling SomePackage:

    Successfully uninstalled SomePackage

  Running setup.py install for SomePackage

  Successfully installed SomePackage


Uninstall a package:


$ pip uninstall SomePackage








你可能感兴趣的:(mysql笔记)