MySQL学习笔记

一,创建表T1:

create table t1(
col1 char(6) not null default ‘‘,
col2 character(6),
col3 varchar(6),
col4 national varchar(6));

 

二,查看表结构:
desc t1;
explain t1;
show columns from t1;


三,查看表的定义:
show create table t1;

CREATE TABLE `t1` (

  `col1` char(6) NOT NULL DEFAULT ‘‘,

  `col2` char(6) DEFAULT NULL,

  `col3` varchar(6) DEFAULT NULL,

  `col4` varchar(6) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

从查看表结构show create  table t1 可以看出,MySQL系统里把char和character当做是一样的,都用char表示;varchar和national varchar是一样的,都用varchar表示。

四,增加一个表列

alter table t1 add column col5 varchar(30);
alter table t1 add column col6 varchar(60);

 

五,删除一个表列

alter table t1 drop column col6;

 

六,查看警告

alter table t1 drop column col8;   表中没有col8的列
show warnings;

Level            Code               Message    

‘Error‘,         ‘1091‘,            ‘Can‘‘t DROP ‘‘col8‘‘; check that column/key exists‘

 

七,sql_mode的查看和设置

查看sql_mode 的默认值
show variables like ‘sql_mode‘;

select @@sql_mode;

修改sql_mode的默认值

set sql_mode=‘pad_char_to_full_length‘;

 可以同时设置多个值,中间用逗号隔开

SET sql_mode=‘STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO‘;

 

八,查看帮助

help year;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

create table t1(
col1 char(6) not null default ‘‘,
col2 character(6),
col3 varchar(6),
col4 national varchar(6));

char和character是一样的
varchar和national varchar是一样的。

查看表结构:
desc t1;
explain t1;
show columns from t1;
查看表的定义:
show create table t1;

 

alter table t1 drop col2;
alter table t1 drop col4;

show warning;

sql_mode  默认是‘‘
show variables like ‘sql_mode‘;
set sql_mode=‘pad_char_to_full_length;

select length(col1),col1,length(col3),col3 from t1;
不同的sql_mode对数据插入的值的截断模式

alter table t1 var_t add col2 varchar(1000);
此时出错

create table var_utf(col1 varchar(65000)) charset=utf8;

 


Binary &n varbinary
create table bin_t1(col1 binary(4));
insert into bin_t1 set col1=‘a‘;
select col1=‘a\0\0\0‘ from bin_t1;


BLOB:二进制
TEXT:很长的字符串

TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB
TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT

FULLTEXT:全文索引

ENUM:枚举,返回的是索引,最大长度65535
create table enum_t(col1 enum(‘F‘,‘M‘‘UN‘));
即这个列的值只能是上面三个值
select col1,col1+0 from enum_t;


SET  can support 64 members
create table set_t(col1 set(‘F‘,‘M‘,‘UN‘));
insert into set_t values(‘F‘);
insert into set_t values(‘M‘);
insert into set_t values(‘FM‘);
insert into set_t values(‘F,M‘);
insert into set_t values(‘F,M,UM‘);
select col1,col1+0 from set_t;

 

tinyint            1Byte
smallint           2Bytes
mediumint          3Bytes   auto_increment
int(integer)       4Bytes   auto_increment money,salary,     int(1) 1表示显示的宽度
bigint             8Bytes   science digit,population

create table int_t(id int(2));
insert into int_t values(12345678);
insert into int_t values(1234567899);

create table int_t2(id int(6) zerofill);
insert into int_t2 vlues(12345678);
insert into int_t2 vlues(123);

help decimal;

decimal 默认是10个bytes
decimal(g,f) g can up to 65, g can up to 30
create table dec_t(id decimal(10,2));
insert into desc_t values(1000.22);


DATETIME  8Bytes
YEAR
DATE  3Bytes
TIME  3Bytes
TIMESTAMP
Zero
mysql>help year;
create table y_t1(col1 year(2),col2 year(4),col1 year(100));
insert into y_t1 values(‘77‘,‘1977-01-09‘,‘‘);
insert into y_t1 values(‘‘,‘‘,‘2188‘);

create table timestamp_t1(col timestamp default current_timestamp on update current_timestamp,id smallint);
desc timestamp;
insert into timestamp_t1 values(‘‘,100);
insert into timestamp_t1 values(now(),200);
update timestamp_t1 set id=101 where id=100;

加载入时区到mysql数据库
cd /usr/local/mysql/bin
.mysql_tzinfo_to_sql /usr/share/zoneinfo | /usr/local/mysql/bin/mysql - uroot -S /tmp/mysql3307.sock mysql

select * from

create table tz_t1(login_d timestamp default current_timestamp);
show variables like ‘time_zone%‘;
insert into tz_t1 values(now());
select * from tz_t1;
set time_zone=‘America/Los_Angeles‘;

show character set; 查看当前数据库字符集
MYSQL5 以上该成UTF8了

2014-07-08  5th as begining
create table bit_t1(bt bit(10));
insert into bit_t1 values (0),(1),(2);
select * from bit_t1;
select bt,bt+0 from bit_t1;
select bt,bt+0,bin(bt) from bit_t1; 

insert into bit_t1 set bt=b‘11111‘;
select bt,bt+0,bin(bt) from bit_t1;
select * from bit_t1 where bt=11111;
select * from bit_t1 where bt=‘11111‘;
select * from bit_t1 where bin(bt)=11111;
delete from bit_t1 where bin(bt)=11111;

float(p)  p: precision  p最大24 如果大于24直接专成double
create table flo_t(id float(10),id2 float(24), id3 float(25));
desc flo_t;
alter table flo_t add id4 float(50));
desc flo_t;


DOUBLE
DOUBLE(g,f)
show variables like ‘sql_mode‘;
set sql_mode=‘real_as_float‘;
create table real_t(id real(10));
help real;
create table real_t(id real(10,2));
desc real_t;
set sql_mode=‘‘;
drop table real_t;
create table real_t(id real(10,2));


NOT NULL
NULL
DEFAULT
AUTO_INCREMENT
UNSIGNED
ZEROFILL

CRATE table auto_t1(id smallint auto_increment primary key);
desc auto_t1;
insert into auto_t1 values();
select * from auto_t1;
insert into auto_t1 values();
select * from auto_t1;
show variables like ‘auto_increment%‘;
select last_insert_id();


BOOL
HELP BOOL;
help boolean;
select if(0,‘true‘,‘fals‘);


MySQL management
mysql
mysqladmin
mysqlshow

which mysql
vi .mysql_history
mysql>status
mysql>show databases;
mysql>\s
mysql>select database();
mysql>select current_user();
mysql>nopager


mysql>create database ch charset=utf8;
mysql>use ch;
mysql>\s
mysql>set names utf8;
mysql>\s

mysql>grant all on *.* to watson@localhost identified by ‘watson‘;
flush privileges;

三种连接数据库方式:
mysql -u watson -p mydbname
mysql -u watson -p -D mydbname
mysql -u watson -p --database=mydbname

切换数据库:
mysql>use dbname;
mysql>\u dbname

vi pwd
watson
chmod 700 pwd
mysql -uwatson -p‘cat pwd‘

vi show
set names utf8;
show databases;
show databases;
use test;
create table tt(id int not null,name varchar(100)) engine=innodb;
非交互方式:
#mysql -uwatson -p‘cat pwd‘ < show
交互方式:
rename table tt to ttt;
mysql>source show;
pwd
mysql>\. /root/show;
#mysql -uwatson -p‘cat pwd‘ -e "show databases;"
#mysql -uwatson -p‘cat pwd‘ -e "show processlist;"
#mysql -uwatson -p‘cat pwd‘ -e "show master status;"


#mysql -uwatson -p‘cat pwd‘ -e "show master status\G;"
exit,quit or \q

 

 

 

mysqladmin命令:
shutdown database
create database
drop database
display variables & status
flush
kill

mysqladmin -uwatson -p‘cat pwd‘ create dbname
mysqladmin -uwatson -p‘cat pwd‘ drop dbname
mysqladmin -uwatson -p‘cat pwd‘ extended-status
mysqladmin -uwatson -p‘cat pwd‘ flush-privileges
mysqladmin -uwatson -p‘cat pwd‘ processlist
mysqladmin -uwatson -p‘cat pwd‘ kill processid
mysqladmin -uwatson -p‘cat pwd‘ ping
/etc/init.d/mysqld stop
mysqladmin -uwatson -p‘cat pwd‘ ping
/etc/init.d/mysqld start

mysqladmin -h 192.168.92.100 -uwatson -p‘cat pwd‘ ping  ping其他的主机
mysqladmin -uwatson -p‘cat pwd‘ status --sleep=1 --count=2
mysqladmin -uwatson -p‘cat pwd‘ status --sleep=1 --count=2

mysqlshow用法:
mysqlshow --help
mysqlshow

mysqlaccess --howto
mysqlaccess --help


Mysql query browser 像OEM
http://dev.mysql.com/downloads/gui-tools

 


Metadata元数据 data dictionary(frm file)
create table my1(id int) engine=myiasm;
file my1.frm
strings my1.frm

create table my2(id int) engine=innodb;

create table csv1(id int not null) engine=csv;
create table arc1(id int not null) engine=archive;

create view v1 as select * from my1;
show create table v1;
strings v1.frm

show variables ‘version%‘
set @a=‘abc‘;
select @a;
show variables like ‘sort_buffer%‘;
set sort_buffer_size=256*1024;
set sort_buffer_size=default;
show variables like ‘tx_isolation%‘;
help isolation;
set session transaction isolation level read committed;
show variables like ‘tx_isolation%‘;
set global transaction isolation level read uncommitted;

use information_schema;
desc global_variables;
select * from global_variables where  variable_name=‘max_connections‘;
show variables like ‘max_connections%‘;
select @@global.max_connections
set global max_connections=1000;
show status;
show status like ‘open%‘;
show global status ;
show session status ;
show global status like ‘open%‘;
show session status like ‘open%‘;
show master status;
show slave status;
desc tables;
select * from tables where table_type !=‘SYSTEM VIEW‘ limit 1\G;

show profiles;
show varibales like ‘prof%‘;
set profiling = ON;
select * from tables where table_type !=‘SYSTEM VIEW‘ limit 1\G;
SHOW PROFILES;
help SHOW PROFILES;
show profile for query 1;
show profile CPU for query 1;

USER_privileges;
schema_privileges;
table_privileges;
column_privileges;
desc processlist;

 


Binary Log:
record of changes(ddl,dml)

Used for replication or Point-In-Time-Recovery(PITR)

how to enable binlog
vi /etc/mysql/my.cnf
#log_bin = /opt/binary/[basename]
log_bin = /opt/binary/CHANGE

mkdir /opt/binary/
chown -R mysql /opt/binary/

启动服务
/etc/init.d/mysql start

cd /opt/binary
ls -lt
flush logs;  回自动的切换日志文件
help purge;

自动删除log
--expire_log_days
show variables like ‘expire_log%‘;

binlog files
Index file
cat CHANGE.index
mysqlbinlog CHANGE.000001
show binlog events;
- IN file
- FROM position
- LIMIT events
show binlog events
help show binary logs;
show binlog events in ‘CHANGE.000002‘;
show binlog events in ‘CHANGE.000002‘ from 106;
show binlog events in ‘CHANGE.000002‘ from 106 limit 1;

purge binary logs to filename;
purge binary logs before datetime;
purge binary logs to ‘CHANGE.000001‘;
purge binary logs to ‘CHANGE.000002‘;
flush logs;
insert into a values (131,‘gen‘);
show binary logs;
show binlog evnets in ‘CHANGE.000003‘;
purge binary logs before ‘2010-03-31 7:25:09‘;

RESET MASTER   很危险,删除所有的logs ,生产环境注意一定。相当与oracle 的 resetlogs


Binary Log Structure:
common header
post-header

mysqlbinlog CHANGE.000004

Context event(s) + Query event = Binlog Group
select rand();
create table a(id int);
insert into a values( rand());


The replicaion user with the REPLICATION SLAVE privilege can read everything.


alter table a add pass varchar(200);
update a set pass=password(‘123‘);

如何让密码在log里加密看不到明文
set  @passwd=password(‘123‘)
update a set pass=@passwd;

如何查看log文件
show variables like ‘log%‘;
show variables like ‘%log%‘;

Error_log   --content(text) :includes error occur|startup|shutdown
Specify:--log_error=file_name (option)          log_error=file_name(configuration)
Rotate log: flush logs,  (shell: mysqladmin flush_logs   mysqladmin refresh)

启动日志: mysql_safe --user=mysql &
关闭日志:mysqladmin -S /tmp/mysql3308.sock shutdown
mysqld --verbose --hlep | grep debug
which mysqld (查看mysqld在什么路径)
mysqld --debug=d,info,error,query,genernal,where:o,/temp/mysqld.trace --user mysql &
show variables like ‘max_connect%‘;
gdb -p 25056 -ex "set max_connections=200" -batch
show variables like ‘max_connect%‘;

 

general_log(普通日志)
-all queries
-be used to debug
config:
--log[=file_name]
-Log_output=[]
mysql --log=/opt/mysql/data/gen.log --user=mysql &
show variables like ‘log_output%‘;
mysql> set log_output=‘TABLE‘;
mysql.general_log表里
mysql>set global log_output=NONE  取消日志

slow_query_log
show variables like ‘%slow%‘;
mysql>set log_slow_queries=ON;
mysql>set slow_query_log=ON;   慢查询
慢查询的工具tools: mysqlslowdump    maatkit  mysqlsla


binary_log
Relay log  (master slave下的)
innodb redo log

 


MYISAM:
Not support:
Transactions
FK
MVCC
Clustered indexes
Data Caches
Cluster Database Support

Physical structure:
.frm
.myd
.myi
$datadir/database/tb.?
show engines;
/etc/my.cnf
default_storage_engine=myiasm

.MYD
1,fixed
2,dynamic
3,packed

show columns from table
:%!xxd看16进制


Full-text search indexes用来解决like查询

alter table tb add index(col1);
alter table tb add unique index(col2);
show index from tb;


key_buffer_size =200M|2G|256*1024*1024  cache index block not data block  可以被所有thread共享
set global hotcache.key_buffer_size=60%
eg. set global hotcache.key_buffer_size=10*1024*1024
cache index a in hotcache;
set global warmcache.key_buffer_size=20%
set global coldcache.key_buffer_size=20%大小
上面的也可以防到/etc/my.cnf里
hotcache.key_buffer_size=10M

可以写个文件:
vi /etc/mysql/initcache.sql
cache index test.a in hotcache

然后把上面的文件防到/etc/my.cnf里
init_file=/etc/mysql/initcache.sql
然后重新启动就可以了


concurrent_insert=0,1,2

 

delay_key_write=ON,OFF,ALL  enumeration 枚举类型的


max_write_lock_count =5
表示等5个写锁完成后,才可以读
low_priority_updates=OFF则表是读的级别高,写的级别低


preload_buffer_size  default 32k 预载入多少buffer_size 

show status like ‘Key%‘;


myiasm_block_size  default 1024Byte
查看linux的块的大小: getconf PAGESIZE
myiasm_data_pointer_size default value is 6


tmpdir

myiasm_recover
myiasm_recover_options=DEFAULT,BACKUP,FORCE,QUICK

myiasm_repair_threads

myisam_use_mmap   mmap:memory mapping


Query Cache:
show status like ‘qcache%‘;
show status like ‘com_%‘;
show status like ‘query_cache%‘;

query cache会保存sql statement 和 result set
清除query cache
flash query cache;


Lock(s) in mysql: MYIASM Engine
Internal locking--MySQL server
External locking: OS -File system
读写同时请求的时候,写优先,读等待。
写的时候会锁整个表。串行化写
read blocks write  读锁会阻塞写
mysql>promp session1

help lock
lock table t1 read   强制加锁
select * from t1;
如果当前session没有解锁,则他不能查询其他的信息了,但是其他的session是可以读的。
select * from mysql.user limit 1;
释放锁:退出session  或者unlock tables;

write blocks read  写阻塞读(mysql 5.1之前的版本,之后是不阻塞的)
lock table t2 write;   强制加写锁
unlock tables


write blocks write   写阻塞写(指的是其他的session是不可以写的,当前的session是可以做DML的)

concurrent insert & select (concurrent insert =0|1|2)
并发的插入

help lock;

 

Myisam Tools:
Mysqlcheck
Myisamchk
--checks,repairs,optimizes,or analyzes tables

mysqlcheck --help
mysqlcheck [options] databasename tablename,must be used when the mysqld server is running

创建一个内存表:
create table mem(id int) engine=memory;
show create table mem;
mysqlcheck test mem;  不支持内存表
mysqlcheck test t1 t2; 可以检查一系列表
mysqlcheck --databases test cddl
mysqlcheck -A   当前数据库的所有的表
which mysqlcheck


mysqlrepair test t1

模拟损坏表(索引没有了)
mv test.MYI /root/
mysqlcheck mydbname test 会出现说文件不存在
修复如下:
mysqlrepair mydbname test 还是不可以修复的
check table test EXTENEDED;
help repair table
repair table test use_frm;
check table test EXTENEDED; 这个时候就正常了


Myisamchk: 尽量这些表没有被写的时候操作
myisamckh --help | more
myisamchk -r -o test.myi

如果表正在操作,我们建议用如下的:
use mysql
check table t1;
optimize table t1;
mysql>\s

myisampack: 压缩表用的
man myisampack ( look help )

解压:
myisamchk -u my/test.MYI

myisampack --test my/test 
select * from test limit 1,1;
压缩后,他就变成只读的表了。
myisamchk  -rq my/test.MYI(mysql5.0 对空表会提示不需要压缩,之后的版本是可以压缩的)

 


Innodb: 事务性引擎(InnoDB Falcon)
innodb_data_file_path=datefile_spec1[;datafile_spec2]...   表空间的位置指定
innodb_data_home_dir
mysql>show engines;
看培植文件:
cat /usr/my.cnf | grep innodb
show variables like ‘innodb%‘;

start transaction;
update t1 set balance=balance-1000 where where id=21345;
update t1 set balance=balance+1000 where where id=12345;
commit;

ACID:atomicity  consistency isolation  duration
isolation: read uncommitted, read committed,repeatable read--mysql default(可重复读), seriliable(串行读)


MVCC:multiversion concurrency control 多版本并发控制

begin,beginwork,start transaction;
commit;

ROLLBACK;
--ddl cannot be rolled back

Savepoints;  让事务回到某个点

AUTOCOMMIT;

Innodb官方:
OLTP oriented
performance ,reliability,scalability
emulated the Oracle architecture

page 16k默认大小  相当于oracle block

 

InnoDB on Disk Format:
InnoDB database files
InnoDB  tablespaces
InnoDB pages/extents
InnoDB rows
InnoDB indexes
InnoDB logs

 

 

show variables like ‘datadir%‘; 默认数据位置
每个表只有两个文件
innodb_file_per_table =OFF|ON   如果是OFF 则在ibdata1(系统表空间,即共享表空间) files路径下,这样的话,ibdata 就会很大,如果不让数据文件和索引文件不要在ibdata1表空间里,则可以增加个培植文件中
/usr/my.cnf
default_storage_engine=innodb
innodb_file_per_table=1   or ON

数据文件和索引文件是:t1.ibd

show variables like ‘innodb_data%‘;

也可以设置多个ibdata1 表空间,表空间由多个文件组成的
/usr/my.cnf
innodb_data_file_path=ibdata1:100M;ibdata2:10M:autoextend
重新启动mysql server
show engines; 是看不到innodb的
回出错的,需要重新修改会10M重新启动就可以了
show engines; 这个是时候是可以看到innodb的


tail -f -30

如果innodb_file_per_table =ON的话,ibdata files只是记录:internal data dictionary|insert buffer|undo logs信息的。一些表的数据和索引信息是不会写到此表空间的

The page size is always 16KB in uncompressed tablespaces, and 1KB-16KB in compressed tablespaces(for both data and index)

System Tablespace includes:
internal data dictionary
undo
insert buffer
doublewrite buffer
MySQL Replication info

Talbespace <--segment <-- extent <-- page <--row

an page=16KB
an extent=64 pages


多版本:获取和释放锁。就是更新的时候即要保存更新前(undo)的状态,也要保存新的值(redo)。等commit的时候
就安全的写到redo里。supports row lock

unlimited row-level locking  可以所很多行
multi-version read-consistency. 把旧值防到undo里,供其他的session一致性读。


mysql> begin;
mysql>update ttt set name=‘bill‘ where id=2;
mysql>commit;

update lost;更新丢失

intention locks 意象锁
共享锁SL,排它锁XL


Lock type compatibility:
       X   IX    S  IS
X      N   N     N  N
IX     N   Y     N  Y
S      N   N     Y  Y
IS     N   Y     Y  Y


Auto-Increment Locking:
1,Innodb uses a table-level ‘auto-increment lock‘
2,Table-level lock occurs at time of INSERT
3,Lock is released at statement end,not transaction end
所以就是一个bottleneck when 并发大于10的时候

5.1.22 version
innodb_autoinc_lock_mode=2 but not safe with statement-based replication or recovery scenarios.


row-based replication
statement-base replication


Phantoms vs consistency  (幻读与一直性)
PHANTOM: a row that appears in a second query that was not in the first.

如何避免幻读:Gap Locking来解决,可以研究下


Innodb stores table locks in memory

select ... for update sets explict row locks.

show variables like ‘autocommit%‘;
autocommit on  表示是自动提交,如果我需要自己提交,则需要显示的设置事务开始和结束。
start transaction /start work/begin
ddl dml
savepoint savename
commit;
rollback savepoint to savename;表示savename之后的操作全部回滚掉。

 

 


MySQL Lock:
Locks are used by a thread to keep other threads from modifying data in the area of the database.

Read Lock

Write Lock

dead lock


Table lock   myiasm
|Page lock   BDB
| Row lock   innodb

show global variables like ‘%lock%‘;
show status like ‘%lock%‘;
注意table_locks_waited值 

MyISAM, Memory only supports table lock.

 

 

lock tables t1 read|write
lock tables t1, t2 read|write
unlock tables  必须手动释放,如果手动加锁,所以手锁很危险的
help lock
必须要有lock tables权限才可以的
read lock自己和其他人都不能写


lock tables t1 read local;  自己不能写,别人可以写的,允许其他人在表的尾部写入数据。
unlock tables;


lock table t1 write  自己可以读,别人读等待


lock table t1 low_priority write;
show variables like ‘%low%‘;
low_priority_updates
show variables like ‘max_write_lock_count%‘; 多少写量后,可以进行读了。

 

 

Innodb lock:
row-locking  是基于innodb engine 的
table-locking   是基于mysqld的。
next-key locking
gap locking
insert intention gap locking
show status like ‘innodb_row_lock%‘   看统计信息的
show variables like ‘innodb_lock%‘    相关的参数信息

S-SHARED
X-exclusive
IS Intention Shared     意向共享锁
IX Intention Exclusive  意向排它锁

显示发起锁
IX
select ...for update

IS
select ... lock in share mode


select * from lt where id=100 lock in share mode;

show errors;
show engine innodb status\G

innotop 见控锁的工具
INNODB 回自动的帮表加个索引,如果没有创建索引的话


prompt (session 1 \u@\h [\d]) (\R:\m:\s)>
set session|global transaction level read uncommitted|read committed

select @@session.tx_isolation;
read uncommitted 会发生脏读
Phantom reads: 幻读 同一个事务中,不同的时间,读的信息不一样。
脏读和幻读区别不明白

DDL 是隐式的自动提交。


Replication:
Master:
-changes data
-Has binlog enabled
-Pushes binlog events when needed

Slave:
-Ask master for replication logs
-Get binlog event from master
-control point of replication

Binary log:


synchronous replication  (commit后就复制)
-a transaction is not committed until the data has been replicated (and applied)
-safer, but slower
-in mysql cluster

asynchronous replication
-a transaction is replicated after is has been committed
-faster,but you can in some cases loose transactions if master fails
-easy to set up between mysql servers

semi-sync replication (5.5 version)
-a transaction is replicated after is has been committed on master and at least one slave receipt of all replication events for the transaction
-Be used to protect user transaction when error occur in asynchronous replication


http:www.foxitsoftware.com

How to configure Master- Slave replication
Mater configuration--required
-Log_bin
-server-id

Slave configuration -required
-server_id
-different from master‘s server_id

optional items:
master:
-binlog-do-db    明确指定复制那些数据库,那些数据库不复制,当有许多数据库的时候
(eg:
binlog-do-db=db1
binlog-do-db=db2
)
-binlog-ignore-db

slave:
-replicate-do-db
-replicate-ignore-db
-replicate-do-table
-replicate-ignore-table
-replicate-wild-do-table
-replicate-wild-ignore-table
-read-only  (root用户还是可以修改的)
-log-slave-updates  可以做其他slave的master,它自己即是slave也是master,但是用的场景不多
-skip-slave-start  master 启动的时候随即启动


configuration -grants on master
grant replication slave on *.* to    (必须是*.*  所有库所有表的权限)
‘repl_user‘@‘repl_host‘ identified by ‘repl-pass‘;

 

DEPLOY(1)
step1: master
-check log_bin if turn on
-check server_id


step2: make a backup of the master
-online or offline backup

DEPLOY(2)
step3:slave
1,restore the backup to slave
--mysql<
--others

2,specified the point where start to replicate
-CHANGE MASTER TO xxxx

3,startup slave to catch up with master
-start slave

4, check slave status
-show slave status\G

 


CHANGE MASTER TO
1,used on slave
2,requires super privileges
3,configures the slave server connection to the master
4,slave should not be running
5,the user need replication slave privileges on master
change master to
master_host=‘192.168.92.100‘
master_user=‘repl‘
master_password=‘repl_pwd‘


start slave | stop slave
1,used on slave
2,used to start or stop the slave threads
3,defaults to affecting both I/O and SQL thread
4,..but individual threads can be started or stopped
5,start slave SQL_THREAD
6,START SLAVE IO_THREAD


复制和engine无关:
innodb to innodb
innodb to myisam
myiasm to innodb
memory to myisam

 


one master to many slaves
master slave ---master slave  主库备库 主库备库

show master status\G

show binary logs;
used on master;
requires super privileges;

show binlog events
used on master
requires super privileges;

show slave hosts
used on master
requires super privileges;
show list of slaves currently registered with the master
only slaves started with report-host option are visible

purge binlog logs
used on master
expire_log_days

SQL_LOG_BIN
set SQL_LOG_BIN
used on master
requires super privileges
session variable
controls logging to binary log
does not work for NDB

mysql>set SQL_LOG_BIN=0;
mysql>insert into t1 values(1,2,3);
mysql>set sql_log_bin=1;


EXPIRE_LOGS_DAYS
0 means "never expire"
used on master
requires super privileges
positive value means expire logs after this many days
logs will be removed at startup or binary log rotation
can be used with running slave
logs are removed ! make sure you have backup!

 


RESET MASTER
used on master
requires reload privileges
deletes all binary logs in the index file
resets binary log index
used to get a "clean start"
use with caution!you lose data!!!

 

SHOW SLAVE STATUS
used on slave
requires super or replication client privileges


RESET SLAVE
used on slave
removes all info on replication position
-deletes master.info ,relay-log.info and all relay logs
relay logs are unconditionally removed!!!
..even if they have not been fully applied

 

SET GLOBAL SQL_SLAVE_SKIP_COUNTER
used on slave
global sever variable
requires super privilege


HA:双master

 

 

 

 

 

 

 

 


HA OVERVIEW
HA : HIGH availability
SPOF: single point of failure
Failover: switch over automatically
switch over---manually

 

 

MySQL HA solution
MySQL replication
MySQL DRBD
MySQL with shared storage
MySQL cluster

24*365*60*60*(1-0.99999)


MYSQL Replication
Master sever:
changes data
keeps log of changes

slave server:
ask master for events
executes events


Synchronouse replication
1,data is replicated and appllied then committed
2,provides consistency ,but slower
3,provided by MySQL Cluster

Asynchronous replication
1,transactions committed immediately and replicated
2,no consistency,but faster
3,provided by MySQL Server

SemiSyncReplication
1,provided by Google


Binary log
1,log every change (select 是不记录的,只记录改变的)
2,split into transaction groups

File: master_bin.NNNNNN
1,The actual contents of the binlog
File: master_bin.index
1,an index file over the files above

 

Master: I/O thread

Slave: I/O thread and SQL Thread
master.info contains:
Read coordinates:
-master log name and master log position
Connection information:
-host,user,password ,port
-SSL keys and certificates

relay-log.info contains:
Group master coordinates:
-master log name and master log position
Group relay log coordinates:
-relay log name and relay log position

 

Steps:
1,Fix my.cnf file for master and slave
2,add user and grants on master
3,take backup of master
4,bootstrap slave from backup
5,configure slave
6,start slave
7,check slave status  show slave status\G

Master configuration --required(必选择)
log_bin
server_id

slave configuration --required(必选择)
server_id
--different from master‘s server_id

show variables like ‘server%‘;
show variables like ‘log%‘;  看log_bin是否开启用
show grants for [email protected];


设置全局锁:
flush tables with read lock;
show master status;  记住位置
unlock tables;


show variables like ‘datadir%‘;


show grants;
MYSQL data dictionary: information_schema 此数据库不能更新的
它store database metadata
CHARACTER_SETS 当前数据可以支持的字符集
collations校对字符集
collation_character_set_applicability
tables: 包含数据库中所有的表

select concat(‘grant select ,insert on ‘,table_schema,‘.‘, table_name ,‘ to abc@localhost;‘) from
tables where table_schema=‘sakila‘ and talbe_name like ‘%actor%‘;

COLUMNS 表

statistics 表的索引的统计信息
show index dbname.tbname;
user_privileges  用户级别的权限
schema_privileges 库级别的权限
table_privileges 表级别的权限
column_privileges 列级别的权限
table_constraints  表之间的关系
KEY_COLUMN_USAGE
ROUTINES
VIEWS
TRIGGERS


提升MYSQL的安全性

目录权限
mysql_secure_installation
mysql>\! ls -lt /var/lib/mysql
skip-networking
bind-address=127.0.01
禁止local infile   local_infile=0
show variables like ‘%local_infile%‘

vi /tmp/tt
1 china
2 usa
3 XXX
mysql>set @@global.local_infile=1;
mysql>load data local infile ‘/tmp/tt‘ into table tt;

我的命令会记录在: ~/.mysql_history

数据传输:
SSL
-Openssl
-Yassl
show variables like ‘%ssl%‘;


备份的安全
-加密
-放银行
-放专门的备份机


拥护相关的
user@ip or host
权限最小化
保护好你的root或改名
rename user [email protected] to[email protected]
show grants for [email protected]
删除空用户或空密码
定期检查用户,对用户进行登记

MysqlRoles工具from google

SQL INJECTION SQL注入

 

 

 

 

 

 

 

 

 


 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。