mysql笔记

2019-03-08  本文已影响0人  流痕无迹

mysql笔记

查看事务隔离级别

show variables like '%iso%';

+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+

设置事务级别

set seesion tx_isolation='read-committed'

mysql事务

begin;
sql
commit;

建表时指定存储引擎

create database test default character set utf8 collate utf8_general_ci;
use test;
create table myIsam(id int,c1 varchar(10)) engine=myisam;

innodb

  1. Innodb使用表空间进行 数据存储

    innodb_file_per_table

    ON:独立表空间:tablename.ibd

    OFF:系统表空间:ibdataX

    show variables like 'innodb_file_per_table';

     +-----------------------+-------+
     | Variable_name         | Value |
     +-----------------------+-------+
     | innodb_file_per_table | ON    |
     +-----------------------+-------+   
    

    set global innodb_file_per_table=off;

    独立表空间,可以通过optimize table命令收缩系统文件。

  2. 系统表空间到独立表空间的转移

    1)使用mysqldump导出所有数据库表数据

    2)停止MySQL服务,修改参数,并删除Innodb相关文件

    3)重启MySQL服务,重建Innodb系统表空间

    4)重新导入数据

  3. log缓冲区大小(1秒刷一次到磁盘)

    show variables like 'innodb_log_buffer_size';

     +------------------------+----------+
     | Variable_name          | Value    |
     +------------------------+----------+
     | innodb_log_buffer_size | 16777216 |
     +------------------------+----------+
    

日志文件个数
show variables like 'innodb_log_files_in_group';

+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_log_files_in_group | 2     |
+---------------------------+-------+
  1. 查看表的定义
    show create table tablename;
    show create table myInnodb;

  2. 锁定表
    lock table myInnodb write;
    unlock tables;

6.Innodb状态检查
pager more
show engine innodb status;

mysql5.7版本以后,Innodb支持全文索引和空间函数

CSV存储引擎

特点

* 以CSV格式进行数据存储
* 所有列必须都是不能为NULL的
* 不支持索引
* 可以对数据文件直接编辑

存储说明

* .CSV存储表内容
* .CSM存储元数据,如表状态和数据量
* .frm存储表结构信息

编辑完文件,要 flush tables;

demo

create table mycsv(id int not null,c1 char(10) not null) engine=csv;
insert into mycsv values(1,"aa"),(2,"bb");
sudo vim /var/lib/mysql/test/mycsv.CSV
flush tables;
select * from mycsv;

使用场景

数据交换

Archive引擎

特点

demo

create table myarchive(id int auto_increment not null,c1 varchar(10), c2 char(10), key(id)) engine=archive;

使用场景

日志和数据采集类应用

Memory引擎

特点

demo

create table mymemory(id int,c1 varchar(10), c2 char(10)) engine=memory;
create index idx_c1 on mymemory(c1);
create index idx_c2 using btree on mymemory(c2);

查看索引语句

mysql> show index from mymemory\G

*************************** 1. row ***************************
        Table: mymemory
   Non_unique: 1
     Key_name: idx_c1
 Seq_in_index: 1
  Column_name: c1
    Collation: NULL
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: HASH
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: mymemory
   Non_unique: 1
     Key_name: idx_c2
 Seq_in_index: 1
  Column_name: c2
    Collation: A
  Cardinality: NULL
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

查看表状态

mysql> show table status like 'mymemory'\G

*************************** 1. row ***************************
           Name: mymemory
         Engine: MEMORY
        Version: 10
     Row_format: Fixed
           Rows: 0
 Avg_row_length: 66
    Data_length: 0
Max_data_length: 6964122
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2018-04-30 18:11:11
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)

使用场景

注意: Memory数据易丢失,所以要求数据可再生

显示所有引擎

show engines;

mysql重新启动(ubuntu)

启动方式
1、使用 service 启动:
[root@localhost /]# service mysqld start (5.0版本是mysqld)
[root@szxdb etc]# service mysql start (5.5.7版本是mysql)
2、使用 mysqld 脚本启动:
/etc/inint.d/mysqld start
3、使用 safe_mysqld 启动:
safe_mysqld&
b、停止
1、使用 service 启动:
service mysqld stop
2、使用 mysqld 脚本启动:
/etc/inint.d/mysqld stop
3、mysqladmin shutdown
c、重启
1、使用 service 启动:
service mysqld restart 
service mysql restart (5.5.7版本命令)
2、使用 mysqld 脚本启动:
/etc/init.d/mysqld restart

mysql服务器参数

参数分全局和session

show variables where variable_name='wait_timeout' or variable_name='interactive_timeout';
上面两个值要一起修改,不然取大的

临时表

  1. 系统使用临时表(如查询时)
  2. create temporary table 建立的临时表

MySQL服务器参数

内存

Innodb_buffer_pool_size (缓存池内存)

总内存=每个线程所需要的内存*连接数)-系统保留内存

key_buffer_size (myisam索引内存)

select sum(index_length) from information_schema.tables where engine='myisam';
+-------------------+
| sum(index_length) |
+-------------------+
|             45056 |
+-------------------+
1 row in set (0.17 sec)

测试工具

系统整体测试

apache ab
http load

MySQL测试工具

mysqlslap 5.1后随MySQL自带

  1. 特点:

    • 可以模拟服务器负载,并输出相关统计信息
    • 可以指定也可以自动生成查询语句
  2. 常用参数

    --auto-generate-sql 
    --auto-generate-sql-add-autoincrement
    --auto-generate-sql-load-type   查询类型
    --auto-generate-sql-write-number    指定初始化数据时生成的数据量
    --concurrency   指定并发线程数量
    --engines   指定测试表的存储引擎,可以逗号分割多个存储引擎
    --no-drop   指定不清理测试数据
    --itreations    指定测试运行的次数,和上一个参数冲突
    --number-of-queries 指定每一个线程执行的查询数量
    --debug-info    指定输出额外的内存及CPU统计信息
    --number-int-cols   指定测试表中怨念的INTo类型列的数量
    --number-char-cols  指定测试表中包含的varchar类型的数量
    --create-schema 指定了用于执行测试的数据库的名字
    --query     用于指定自定义SQL的脚本
    --only-print 并不运行测试脚本,而是把生成的脚本打印出来
  1. demo

    mysqlslap --concurrency=1,50,100,200 --iterations=3 --number-int-cols=5 --number-char-cols=5 --auto-generate-sql --auto-generate-sql-add-autoincrement --engine=myisam,innodb --number-of-queries=10 --create-schema=sbtest -uroot -p

    mysqlslap: Error when connecting to server: 1040 Too many connections
    max_connections默认值为100

    --only-print 显示实际执行的脚本

sysbench

sysbench --test=cpu --cpu-max-prime=10000 run
sysbench --test=fileio --file-total-size=1G prepare
sysbench --test=fileio help
sysbench --test=fileio --threads=8 --file-total-size=1G --file-test-mode=rndrw --report-interval=1 run

//something error
sysbench --test=/home/liuji/share/sysbench-0.5/sysbench/tests/db/oltp.lua --mysql-table-engine=innodb --oltp-table-size=10000 --mysql-db=testdb --mysql-user=root --mysql-password=ji1028 --oltp-tables-10 --mysql-socket=/usr/mysql/data/mysql.sock  prepare

/var/run/mysqld/mysqld.sock
先prepare准备数据,再run

MySQL数据类型

时间

demo

set time_zone='-10:00';
create table time(d1 datetime,d2 timestamp);
insert into time(d1,d2) values(now(),now());
select * from time;
set time_zone='+10:00';
show variables where variable_name='time_zone';

存储微秒
alter table time modify d1 datetime(6);
alter table time modify d2 timestamp(6);
select * from time;

drop table time;
created table time(id int,d1 )

二进制日志

基于段的二进制日志 statement row mixed

show variables like 'log_bin';

show variables like 'binlog_format';

    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | binlog_format | ROW   |
    +---------------+-------+
    1 row in set (0.00 sec) 

    set session binlog_format=statement;
    show binary logs;
    flush logs;

show variables like 'binlog_row_image';
full 全记录
minimal 只记录修改的列(建议使用)
noblob 不记录blob(text)列

配置mysql复制

  1. 基于日志点的复制配置步骤
    create user 'repl'@'ip段' identified by 'password';
    grant replication slave on . to 'repl'@'ip段'

  2. 配置主数据库服务器
    bin_log = mysql-bin
    server_id = 100 #可以用set命令动态修改,在复制集群中唯一,可以用ip后几位

  3. 配置从数据库服务器
    bin_log = mysql-bin
    server_id = 101
    relay_log = mysql-relay-bin
    log_slave_update = on [可选]
    read_only = on [可选]

  4. 从主数据库初始化到从数据库(2种)
    mysqldump --master-data=2 -single-transaction
    xtrabackup --slave-info

  5. 启动复制链路(在从服务器上操作)
    change master to master_host = 'master_host_id',
    master_user='repl',
    master_password='password',
    master_log_file='mysql_log_file_name',
    master_log_pos=4;

demo

create user repl@'192.168.3.%' identified by 'pass';
create user 'repl'@'*' identified by 'pass';
grant replication slave on *.* to 'repl'@'*';

bin_log = mysql-bin
server_id = 1

如果主从mysql版本不一致,不要备份系统数据库
mysqldump --single-transaction --master-data --triggers --routines --all-databases -uroot -p >> /home/liuji/all.sql

mysqldump -h192.168.43.160 --single-transaction --master-data --triggers --routines --databases exhibition test -uroot -p >> /home/liuji/all.sql


mysql -uroot -p < all.sql

change master to master_host='192.168.3.100',
master_user='repl',
master_password='pass',
master_port=3307,
#从all.sql中找
#CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;

start slave;

主服务器
mysql> show processlist \G;
Binlog Dump 线程

从服务器2个进程
mysql> show processlist \G;

基于GTID的复制,是从mysql 5.6开始支持的复制方式

  1. 基于日志点的复制配置步骤
    create user 'repl'@'ip段' identified by 'password';
    grant replication slave on . to 'repl'@'ip段'

  2. 配置主数据库服务器
    bin_log = mysql-bin
    server_id = 100
    gtid_mode=on
    enforce-gtid-consistency=on
    log-slave-updates = on #5.7不需要,之前版本需要

  3. 配置从数据库服务器
    server_id = 101
    relay_log = /usr/local/mysql/log/relay_log
    gtid_mode = on
    enforce-gtid-consistency=on
    log-slave-updates = on
    read_only=on [建议]
    master_info_repository=TABLE [建议]
    relay_log_info_repository=TABLE [建议]

  4. 初始化从服务器数据
    mysqldump --master-data=2 -single-transaction
    xtrabackup --slave-info

  5. 启动基于GTID的复制
    change master to master_host = 'master_host_id',
    master_user='repl',
    master_password='password',
    master_auto_position = 1

查看数据库用户

mysql> use mysql
Database changed
mysql> select user,host from user;

查看授权
show grants for repl@'192.168.3.%'

多线程复制配置(5.7版本开始有的功能)

show processlist;
stop slave;
show slave status\G;
mysql> show variables like 'slave_parallel_type';
+---------------------+----------+
| Variable_name       | Value    |
+---------------------+----------+
| slave_parallel_type | DATABASE |
+---------------------+----------+
1 row in set (0.00 sec)
set global slave_parallel_type='logical_clock';
show variables like 'slave_parallel_workers';
set global slave_parallel_workers=4;
start slave;
show slave status \G;

MMM配置

查看用户
select user,host from mysql.user;

show master status \G

wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

rpm -ivh epel-release-latest-6.noarch.rpm
rpm -ivh remi-release-6.rpm

vim /etc/yum.repos.d/remi.repo
enabled=1
vim /etc/yum.repos.d/epel.repo
#baseurl 的#去掉
mirrorlist 前加上#

搜索可以安装的包
sudo yum search mmm
sudo apt search mmm

yum install mysql-mmm-agent.noarch -y

监控的要安装所有的
yum -y install mysql-mmm*

ip addr 也可以查看ip

MHA (Master High Availability

select user,host from mysql.user;
show grants for 'repl'@'*';
grant all privileges on *.* to mha@'192.168.3.%' identified by '123456';
show variables like '%log%';

读写分离插件 MaxScale

索引

演示数据库
http://downloads.mysql.com/docs/sakila-db.tar.gz

查找重复索引
pt-duplicate-key-checker h=127.0.0.1

查找未被使用过的索引
select object_schema,object_name,index_name,b.TABLE_ROWS
from performance_schema.table_io_waits_summary_by_index_usage a
join information_schema.tables b on
a.object_schema=b.TABLE_SCHEMA AND
a.OBJECT_NAME=b.TABLE_NAME
WHERE index_name IS NOT NULL
AND count_star=0
ORDER BY object_schema,object_name;

慢查询日志:
动态开启
set global slow_query_log=on;

上一篇下一篇

猜你喜欢

热点阅读