Mysql由浅入深

 

 

1.  Mysql的安装方式

    1.  yum安装mysql

        适合对数据库要求不太高的场合,例如:并发不大,公司内部,企业内部。

        1.  官网下载yum源,wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

        2.  rpm -ivh rpm包文件

        3.  安装这个包后,会获得两个mysql的yum repo源:/etc/yum.repos.d/mysql-community.repo,/etc/yum.repos.d/mysql-community-source.repo。

        4.  yum install mysql-server -y

        5.  启动systemctl start mysqld.service

        6.  登录mysql -uroot -p

    2.  二进制方式安装mysql

        很多专业DBA的选择

        1.  下载指定版本的二进制文件包。

            cd /home/tools

            wget https://cdn.mysql.com//Downloads/MySQL-5.6/mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz

        2.  解压压缩包

            tar -zxvf mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz

        3.  将文件包移动到/application下,并且创建一个软链接到/usr/local/mysql

            mv mysql-5.6.40-linux-glibc2.12-x86_64 /application

            ln -s /application/mysql-5.6.40-linux-glibc2.12-x86_64/   /application/mysql

        4.  创建一个mysql用户和组

            useradd -s /sbin/nologin -M mysql

        5.  将/application/mysql/下的所有目录属主和属组都设置为mysql。

            chown -R mysql.mysql /application/mysql/

        6.  初始化mysql

            scripts/mysql_install_db --user=mysql

            报错:

FATAL ERROR: please install the following Perl modules before executing scripts/mysql_install_db:

Data::Dumper

            解决方法:

               yum install autoconf -y

               再次执行初始化,没有这个报错了。又有其他报错。

WARNING: Found existing config file ./my.cnf on the system.
Because this file might be in use, it was not replaced,

把/etc/my.cnf文件删掉,再执行初始化。

然后检查data目录下,是不是有下面的文件。   

-rw-rw---- 1 mysql mysql 12582912 6月 17 01:21 ibdata1
-rw-rw---- 1 mysql mysql 50331648 6月 17 01:21 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 6月 17 01:18 ib_logfile1
drwx------ 2 mysql mysql 4096 6月 17 01:18 mysql
drwx------ 2 mysql mysql 4096 6月 17 01:21 performance_schema
drwxr-xr-x 2 mysql mysql 19 6月 15 01:40 test

               也可以通过查看data/机器名.err

        7.  把当前目录的用户设置为root。  

            chown -R root .     

        8.  把data目录的属主设置为mysql.

            chown -R mysql data 

drwxr-xr-x 2 root mysql 4096 6月 15 01:40 bin
-rw-r--r-- 1 root mysql 17987 2月 26 20:46 COPYING
drwxr-xr-x 5 mysql mysql 104 6月 17 01:21 data
drwxr-xr-x 2 root mysql 52 6月 15 01:40 docs
drwxr-xr-x 3 root mysql 4096 6月 15 01:39 include
drwxr-xr-x 3 root mysql 4096 6月 15 01:40 lib
drwxr-xr-x 4 root mysql 28 6月 15 01:40 man
-rw-r--r-- 1 root root 943 6月 17 01:21 my.cnf
-rw-r--r-- 1 root root 943 6月 17 01:19 my-new.cnf
drwxr-xr-x 10 root mysql 4096 6月 15 01:40 mysql-test
-rw-r--r-- 1 root mysql 2496 2月 26 20:46 README
drwxr-xr-x 2 root mysql 29 6月 15 01:40 scripts
drwxr-xr-x 28 root mysql 4096 6月 15 01:40 share
drwxr-xr-x 4 root mysql 4096 6月 15 01:39 sql-bench
drwxr-xr-x 2 root mysql 130 6月 15 01:39 support-files

             9.  cp support-files/mysql.server /etc/init.d/mysqld

          10.  sed -i 's#/usr/local/mysql#/application/mysql#g'  /application/mysql/bin/mysqld_safe   /etc/init.d/mysqld

          11.  /etc/init.d/mysqld start

      或者后台启动mysql

    bin/mysqld_safe --user=mysql &

[root@rsync-server mysql]# ps -ef | grep mysql | grep -v "grep"
root 5509 1530 0 01:30 pts/2 00:00:00 /bin/sh bin/mysqld_safe --user=mysql
mysql 5590 5509 1 01:30 pts/2 00:00:01 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=rsync-server.err --pid-file=rsync-server.pid

使用mysqld_safe启动的原因:它是mysqld的守护进程,当mysqld被强制关闭,mysqld_safe会自动启动一个新的进程mysqld。 

         11.  把/application/mysql/bin添加到环境变量

              echo "export PATH=/application/mysql/bin:$PATH"  >>/etc/profile

              source /etc/profile

         12.  清理无用的账户及库

              drop user "root"@"::1";

              drop user ""@"localhost";

              drop user ""@"www";

              drop user "root"@"www";

              flush privileges;

              drop database test;

    3.  二进制安装mysql5.7版本

          

    4.  编译安装mysql

        普通运维人员采用编译的方式。

        编译安装5.6.40版本。

        1.  准备工作

           yum install ncurses-devel libaio-devel -y

           rpm -qa ncurses-devel libaio-devel 

        2.  yum install cmake -y

        3.  useradd -a /sbin/nologin -M mysql

        4.  cd /home/tools

           wget https://cdn.mysql.com//Downloads/MySQL-5.6/mysql-5.6.40.tar.gz

           tar -zxvf mysql-5.6.40.tar.gz

        5.  cd mysql-5.6.40

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cmake .  - DCMAKE_INSTALL_PREFIX = / application / mysql - 5.6 . 40  \
- DMYSQL_DATADIR = / application / mysql - 5.6 . 40 / data \
- DSYSCONFDIR = / etc \
- DWITH_MYISAM_STORAGE_ENGINE = 1  \
- DWITH_INNOBASE_STORAGE_ENGINE = 1  \
- DWITH_MEMORY_STORAGE_ENGINE = 1  \
- DWITH_READLINE = 1  \
- DMYSQL_UNIX_ADDR = / application / mysql - 5.6 . 40 / tmp / mysql.sock \
- DMYSQL_TCP_PORT = 3306  \
- DENABLED_LOCAL_INFILE = 1  \
- DWITH_PARTITION_STORAGE_ENGINE = 1  \
- DEXTRA_CHARSETS = all  \
- DDEFAULT_CHARSET = utf8 \
- DDEFAULT_COLLATION = utf8_general_ci \
- DMYSQL_USER = mysql \
- DWITH_DEBUG = 0  \
- DWITH_SSL = system

        6.  make  这个时间比较长

        7.  make install  

    建议:版本首选5.5以上,安装机器数量少,选择编译;数量多,选择二进制方式。

2.  Mysql的多实例

    1.  Mysql多实例共用一套Mysql安装程序,使用不同的my.cnf配置文件,启动程序,数据文件。

        多实例逻辑上是独立的,但是实际上使用的是同一台服务器资源。

        nginx,apache,haproxy,redis,memcache,都可以多实例。

    2.  Mysql多实例的作用与问题

        1.  有效利用服务器资源

        2.  节约服务器资源

        3.  问题:当某个实例并发很高或者有慢查询的时候,整个实例会消耗服务器的CPU,内存,磁盘IO资源。

    3.  Mysql多实例的应用场景

        1.  资金紧张型公司

        2.  并发访问不是特别大的业务

        3.  百度搜索引擎的数据库就是多实例,一般是从库。

    4.  Mysql多实例的多种配置方案

        1.  多个配置文件多个启动程序多个数据文件

            pkill mysqld  杀死原有的mysqld

            mkdir -p /data/{3306,3307}/data  创建多个实例的数据文件

        2.  单一配置文件

            缺点:耦合性太高

    5.  配置过程

        1.  编译安装完成mysql-5.6.40以后,开始创建配置文件和数据文件和启动文件。

           mkdir -p /data/{3306,3307}/data

        2.  在/data/3306和/data/3307目录下创建多实例的配置文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[mysqld]
basedir = / application / mysql
datadir = / data / 3306 / data
server - id = 3306
port = 3306
log - bin = / data / 3306 / mysql - bin
socket = / data / 3306 / mysql.sock
max_allowed_packet = 8M
sort_buffer_size = 1M
join_buffer_size = 1M
max_connections = 800
max_connect_errors = 3000
#table_cache=614
external - locking = FALSE
thread_cache_size = 100
thread_concurrency = 2
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
ft_min_word_len  =  4      
default - storage - engine  =  InnoDB
thread_stack  =  192K                   
transaction_isolation  =  REPEATABLE - READ
tmp_table_size  =  64M                                   
binlog_format = mixed                   
slow_query_log                 
long_query_time  =  2
key_buffer_size  =  32M                
bulk_insert_buffer_size  =  64M          
myisam_sort_buffer_size  =  128M        
myisam_max_sort_file_size  =  10G      
myisam_repair_threads  =  1            
myisam_recover
innodb_additional_mem_pool_size  =  16M
innodb_buffer_pool_size  =  2G           
innodb_data_file_path  =  ibdata1: 10M :autoextend
innodb_write_io_threads  =  8       
innodb_read_io_threads  =  8
innodb_flush_log_at_trx_commit  =  1    
innodb_log_buffer_size  =  8M           
innodb_log_file_size  =  256M           
innodb_log_files_in_group  =  3         
innodb_max_dirty_pages_pct  =  90       
innodb_lock_wait_timeout  =  120               
[mysqld_safe]
log - error = / data / 3306 / mysql_oldboy3306.err
pid - file = / data / 3306 / mysqld.pid   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[mysqld]
basedir = / application / mysql
datadir = / data / 3307 / data
server - id = 3307
port = 3307
log - bin = / data / 3307 / mysql - bin
socket = / data / 3307 / mysql.sock
max_allowed_packet = 8M
sort_buffer_size = 1M
join_buffer_size = 1M
max_connections = 800
max_connect_errors = 3000
#table_cache=614
external - locking = FALSE
thread_cache_size = 100
thread_concurrency = 2
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
ft_min_word_len  =  4      
default - storage - engine  =  InnoDB
thread_stack  =  192K                   
transaction_isolation  =  REPEATABLE - READ
tmp_table_size  =  64M                                    
binlog_format = mixed                   
slow_query_log                 
long_query_time  =  2
key_buffer_size  =  32M                
bulk_insert_buffer_size  =  64M          
myisam_sort_buffer_size  =  128M        
myisam_max_sort_file_size  =  10G      
myisam_repair_threads  =  1            
myisam_recover
innodb_additional_mem_pool_size  =  16M
innodb_buffer_pool_size  =  2G           
innodb_data_file_path  =  ibdata1: 10M :autoextend
innodb_write_io_threads  =  8       
innodb_read_io_threads  =  8
innodb_flush_log_at_trx_commit  =  1    
innodb_log_buffer_size  =  8M           
innodb_log_file_size  =  256M           
innodb_log_files_in_group  =  3         
innodb_max_dirty_pages_pct  =  90       
innodb_lock_wait_timeout  =  120               
[mysqld_safe]
log - error = / data / 3307 / mysql_oldboy3307.err
pid - file = / data / 3307 / mysqld.pid

      3.  启动文件内容/data/3306/mysql和/data/3307/mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@nfs - server  3306 ] # cat mysql
#!/bin/bash
###################################################
#yangjianbo created
port = 3306
mysql_user = "root"
mysql_pwd = "123"
CmdPath = "/application/mysql/bin"
mysql_sock = "/data/${port}/mysql.sock"
#start function
function_start_mysql()
{
    if  [ !  - "$mysql_sock"  ];then
      printf  "Starting Mysql...\n"
        / bin / sh ${CmdPath} / mysqld_safe  - - defaults - file = / data / ${port} / my.cnf  2 >& 1  > / dev / null &
    else
      printf  "Mysql is running...\n"
      exit
    fi
}
 
#stop function
function_stop_mysql()
{
    if  [ !  - "$mysql_sock"  ];then
      printf  "Mysql is stopped...\n"
      exit
    else
      printf  "Stopping Mysql...\n"
      ${CmdPath} / mysqladmin  - u ${mysql_user}  - p${mysql_pwd}  - / data / ${port} / mysql.sock shutdown
    fi
}
 
#restart function
function_restart_mysql()
{
    printf  "Restarting Mysql...\n"
    function_stop_mysql
    sleep  2
    function_start_mysql
}
 
case $ 1  in
start)
    function_start_mysql
;;
stop)
    function_stop_mysql
;;
restart)
    function_restart_mysql
;;
* )
    printf  "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@nfs - server  3307 ] # cat mysql
#!/bin/bash
###################################################
#yangjianbo created
port = 3307
mysql_user = "root"
mysql_pwd = "123"
CmdPath = "/application/mysql/bin"
mysql_sock = "/data/${port}/mysql.sock"
#start function
function_start_mysql()
{
    if  [ !  - "$mysql_sock"  ];then
      printf  "Starting Mysql...\n"
        / bin / sh ${CmdPath} / mysqld_safe  - - defaults - file = / data / ${port} / my.cnf  2 >& 1  > / dev / null &
    else
      printf  "Mysql is running...\n"
      exit
    fi
}
 
#stop function
function_stop_mysql()
{
    if  [ !  - "$mysql_sock"  ];then
      printf  "Mysql is stopped...\n"
      exit
    else
      printf  "Stopping Mysql...\n"
      ${CmdPath} / mysqladmin  - u ${mysql_user}  - p${mysql_pwd}  - / data / ${port} / mysql.sock shutdown
    fi
}
 
#restart function
function_restart_mysql()
{
    printf  "Restarting Mysql...\n"
    function_stop_mysql
    sleep  2
    function_start_mysql
}
 
case $ 1  in
start)
    function_start_mysql
;;
stop)
    function_stop_mysql
;;
restart)
    function_restart_mysql
;;
* )
    printf  "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac

     4.  初始化多实例的数据库文件

        cd /application/mysql/scripts

        ./mysql_install_db --defaults-file=/data/3306/my.cnf --basedir=/application/mysql --datadir=/data/3306/data --user=mysql

        ./mysql_install_db --defaults-file=/data/3307/my.cnf --basedir=/application/mysql --datadir=/data/3307/data --user=mysql

        出现下面的结果:

           出现两个OK,没有error级别的错误即可。

          初始化的目的:创建基础的数据库系统的库文件。创建完成后,会在/data/3306/data和/data/3307/data目录下创建很多文件。

     5.  启动多实例

          /data/3306/mysql start

          /data/3307/mysql start

          启动的时候报错:

          Starting MySQL.170814 20:02:33 mysqld_safe error: log-error set to '/data/3306/mysql_oldboy3306.err', however file don't exists. Create writable for user 'mysql'.

          解决方法:

          手工创建该文件  touch /data/3306/mysql_oldboy3306.err

          授权  chown mysql.mysql /data/3306/mysql_oldboy3306.err

     6.  检查是否启动成功

          lsof -i:3306

          lsof -i:3307

          netstat -lntup | grep 330

     7.  多实例排错

          查看log-error日志

          /data/3306/mysql_oldboy3306.err

     8.  设置root密码

          第一次登录,是没有密码的。5.7以后需要密码。

          mysqladmin -u root -S /data/3306/mysql.sock password '123'

          mysqladmin -u root -S /data/3306/mysql.sock password '123'

     9.  登录多实例

          本地登录

            mysql -uroot -p -S /data/3306/mysql.sock

          远程登录

            mysql -uroot -p -h 数据库IP -P 3307

     10.  设置开机启动

          centos6

            添加到/etc/rc.local文件中

            /data/3306/mysql start

            /data/3307/mysql start

          centos7

            添加到systemd中

     11.  如何再增加一个mysql实例

          创建对应的目录

          复制配置文件和启动文件,并修改内容

          初始化数据库

          授权

          启动mysql

          设置root密码

3.  Mysql的帮助命令help

      1.  与linux的man命令一样

         进入mysql实例中,然后执行help show

4.  修改mysql密码

      1.  在系统中修改mysqladmin -uroot -p123 password 'yangjianbo' -S /data/3306/mysql.sock

      2.  登录到mysql中,修改账户的密码

         update user set password=password(456) where user='root' and host='localhost';

         flush privileges;

      3.  第一次登录密码为空,进入以后,设置root密码。

         set password=password('123');

         flush privileges;

5.  丢失mysql密码

       先停止数据库

在配置文件中,[mysqld]下面,添加一条内容:skip-grant-tables

然后启动mysql。

以空密码进去,修改root密码。

mysql 5.7

update mysql.user set authentication_string=password('*******') where user='root';

flush privileges; 

mysql 5.5

updatet user set password=password("*****") where user="root";

flush privileges;

       这种方法不只是针对root用户,所有用户都免密码了。  

6.  SQL结构化查询语言

    1.  分类

        DQL  数据查询语言  主要是select

        DDL  数据定义语言  主要是create drop

        DML  数据操作语言  主要是insert delete update

        TPL  事物处理语言  主要是BEGIN TRAN COMMIT ROLLBACK

        DCL  数据控制语言  主要是GRANT REVOKE

        CCL  指针控制语言  DECLARE FETCH

7.  Mysql创建数据库

    1.  创建数据库

        create database yangjianbo;

    2.  查看数据库详细信息

        show create database yangjianbo \G;

1
2
3
4
5
mysql> show create database yangjianbo \G
* * * * * * * * * * * * * * * * * * * * * * * * * * *  1.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * *
        Database: yangjianbo
Create Database: CREATE DATABASE `yangjianbo`  / * ! 40100  DEFAULT CHARACTER  SET  utf8  * /
1  row  in  set  ( 0.00  sec)    默认的字符集为utf8

    3.  创建字符集为GBK的数据库

        create database wangyanhe CHARACTER SET=gbk COLLATE=gbk_chinese_ci;

        如果使用的是编译安装,参数中已经有了字符集的设定,那么默认创建的数据库使用的就是你编译的字符集。        

    4.  企业如何创建数据库

        1.  根据开发的程序确定字符集(建议UTF8)

        2.  编译的时候指定字符集

        3.  如果程序的字符集与默认数据库编译字符集不相符,那么就需要在创建数据库的时候指定字符集。

8.  显示连接删除数据库

    1.  显示数据库

        1.  show databases;  显示所有数据库

        2.  select database();  显示当前数据库

        3.  show databases like 'wang%';    模糊查询数据库

    2.  删除数据库

        1.  drop database wangyanhe;  删除数据库

    3.  连接数据库

        1.  use yangjianbo;  切换数据库

    4.  删除多余账户

        1.  drop user "root"@"::1";

            如果有删除不掉的用户,使用delete from mysql.user 语句进行删除

9.  创建用户并且授权用户

    1.  使用grant命令

        grant all on *.* to wangyanhe@"%" identified by '123';

    2.  使用create命令

        creaet user gaozhongming@"localhost" identified by '123';

        grant all on *.* to gaozhongming@"localhost";

        flush privileges;

10.  本地及远程授权访问

    1.  创建用户

       create user gaozhongming@'192.168.0.%' identified by '123';

       flush privileges;

1
2
3
4
5
[root@nfs - server  3306 ] # mysql -ugaozhongmign -p -S /data/3306/mysql.sock
Enter password:
ERROR  1045  ( 28000 ): Access denied  for  user  'gaozhongming' @ 'localhost'  (using password: YES)
 
[root@nfs - server  3306 ] # mysql -ugaozhongming -p -S /data/3306/mysql.sock -h 192.168.0.200

    2.  用户权限

        1.  收回权限

            revoke

        2.  增加权限         

            grant  

11.  Mysql主从复制

1.  什么是mysql主从复制?

   mysql主从复制是mysql自带的功能,通过逻辑的binlog日志复制到要同步的服务器本地,然后由本地的线程读取日志里面的SQL语句,重新应用到mysql数据库中。

2.  主从复制的结构

   单向复制:一主一从  一主两从  一主多从  多主一从  多主多从

   双向复制:互为主从

   链式复制:类似A-->B-->C

   环式复制:生产场景很少用

   在生产工作中,mysql主从复制都是异步的复制方式。不是严格的实时数据同步。

3.  主从复制的应用场景

   1.  从服务器作为主服务器的实时数据备份

   2.  主从服务器实现读写分离,从服务器实现负载均衡LVS。

      从服务器仅仅处理用户的select查询请求,降低用户查询响应时间。

      对于更新的数据(update,insert,delete语句),交给主服务器处理。

      结构图:

      

   3.  把多个从服务器根据业务重要性进行拆分访问

      有为外部用户提供查询服务的从服务器,

      有内部DBA用来数据备份的从服务器,

      为内部人员提供访问的日志分析及供开发人员查询的从服务器。

      结构图:

      

4.  实现mysql主从读写分离的方案

   1.  通过程序代码实现(PHP和java),生产应用场景最多。

   2.  通过开源的软件(mysql-proxy,amoeba)实现读写分离,这种方式稳定性差,生产不建议使用。

   3.  大型门户网站自己开发dbproxy。

5.  mysql主从复制原理

   1.  介绍

      mysql的主从复制是一个异步的复制过程,数据将从master复制到slave,由三个线程参与完成。其中sql线程和I/O线程在slave,另外一个I/O在master.  

      要实现mysql的主从复制,首先必须打开master的binlog记录功能,否则无法实现。因为整个复制过程就是slave从master获取binlog日志,然后在slave上以相同顺序执行获取的binlog日志中所记录的各种sql操作。

      要打开mysql的binlog记录功能,通过在mysql配置文件my.cnf中的mysqld模块增加"log-bin"参数选项来实现,具体如下:

      [mysqld]

      log-bin=/data/mysql/mysql-bin

    2.  mysql主从复制原理过程详细描述

      1)  master服务器上打开binlog记录功能。

      2)  在slave服务器执行start slave命令开启主从复制开关,开始进行主从复制。

      3)  slave的I/O线程会通过在master上已经授权的复制用户权限请求连接到master服务器,并请求从指定binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容。

      4)  master服务器接收到来自slave服务器的I/O线程的请求后,master上负责复制的I/O线程会根据slave服务器的I/O线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给slave端的I/O线程。返回的信息中除了binlog日志内容外,还有在master服务器端记录的新的binlog文件名称,以及在新的binlog中的下一个指定更新位置。

      5)  当slave服务器的I/O线程获取到master服务器上I/O线程发送的日志内容,日志文件及位置后,会将binlog日志内容依次写到slave自身的relay log,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master新binlog日志时能够告诉master服务器从新binlog日志的指定文件及位置开始请求新的binlog日志内容。

      6)  slave的sql线程会实时监测relay log中的内容,把它解析成sql语句。

    6.  mysql主从复制的配置过程

          1.  在主服务器上打开log-bin,在my.cnf配置文件的mysqld模块下。

              log-bin=/data/3306/mysql-bin 

              log-bin=/data/3307/mysql-bin(如果只是从数据库,不需要配置log-bin;如果是要做级联,需要打开log-bin)

          2.  配置主从的server-id,要不同啊。

              server-id=3306

              server-id=3307

          3.  配置好以后,要重启mysql服务。

              /data/3306/mysql restart

              /data/3307/mysql restart

          4.  检查配置参数后的结果。

              egrep "log-bin|server-id" /data/3306/my.cnf

              egrep "log-bin|server-id" /data/3307/my.cnf

          5.  登录数据库查看

              mysql -uroot -p -S /data/3306/mysql.sock

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> show variables like  'server_id' ;  查看server - id
+ - - - - - - - - - - - - - - - + - - - - - - - +
| Variable_name | Value |
+ - - - - - - - - - - - - - - - + - - - - - - - +
| server_id     |  3306   |
+ - - - - - - - - - - - - - - - + - - - - - - - +
1  row  in  set  ( 0.94  sec)
 
 
mysql> show variables like  'log_bin' ;  查看binlog是否开启
+ - - - - - - - - - - - - - - - + - - - - - - - +
| Variable_name | Value |
+ - - - - - - - - - - - - - - - + - - - - - - - +
| log_bin       | ON    |
+ - - - - - - - - - - - - - - - + - - - - - - - +
1  row  in  set  ( 0.03  sec)

          6.  在主库创建用于主从复制的帐号

              grant replication slave on *.* to 'rep'@'192.168.0.%' identified by '123';

              flush privileges;

             查看一下select user,host from mysql.user;

             show grants for 'rep'@'192.168.0.%';

          7.  实现对主数据库锁表

              flush table with read lock;

          8.  备份主数据库服务器

              mysqldump -uroot -p -S /data/3306/mysql.sock --events -A -B | gzip >/opt/mysql_bak.$(date +%F).sql.gz

              -A  备份所有的库

              -B  直接覆盖原有的库

          9.  解锁主库

              unlock tables;

              查看主库的binlog的position

              show master status;

              show master logs;

          10.  把备份的数据库导入到从服务器上。

              使用scp或者rsync命令复制到从服务器上。

               rsync  -avz mysql_bak.2018-07-05.sql.gz /data/3307/

               gzip -d mysql_bak.2018-07-05.sql.gz

          11.  在从库上的操作,修改配置文件

              server-id 一定不能跟主相同,一定是唯一的。

              如果不做级联,就不用开启binlog,因为会消耗磁盘I/O

              有两种情况需要开启binlog:

                1.  级联

                2.  从库是备份服务器

          12.  在从服务器上还原备份的数据库

                mysql -uroot -p -S /data/3307/mysql.sock <mysql_bak.2018-07-05.sql 

          13.  在从服务器上,登录mysql,执行change master    

1
2
3
4
5
6
7
CHANGE MASTER TO
MASTER_HOST = '192.168.0.200' ,
MASTER_PORT = 3306 ,
MASTER_USER = 'rep' ,
MASTER_PASSWORD = '123' ,
MASTER_LOG_FILE = 'mysql-bin.000008' ,
MASTER_LOG_POS = 406 ;

          14.  在从服务器上,也可以不登陆mysql,执行下面的命令   

1
2
3
4
5
6
7
8
9
mysql  - uroot  - - / data / 3307 / mysql.sock<<EOF
CHANGE MASTER TO
MASTER_HOST = '192.168.0.200' ,
MASTER_PORT = 3306 ,
MASTER_USER = 'rep' ,
MASTER_PASSWORD = '123' ,
MASTER_LOG_FILE = 'mysql-bin.000008' ,
MASTER_LOG_POS = 406 ;
EOF

          15.  在从服务器上,登录mysql,执行

              start slave;

              show slave status\G;

              查看最关键的3个参数 

1
2
3
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master:  0

          16.  在从服务器上,也可以不登陆mysql

              mysql -uroot -p /data/3307/mysql.sock -e "start slave;"

              mysql -uroot -p /data/3307/mysql.sock -e "show slave status\G;"

12.  生产环境快速配置mysql主从复制

      1.  配置好从库,设置好log-bin和server-id参数

      2.  无需配置主库,因为主库已经上线,log-bin和server-id已经配置好了。

      3.  在主库创建帐号,用来主从复制。

      4.  使用mysqldump -uroot -p'123456'  -S /data/3306/mysql.sock -A --events -B -x --master-data=1 | gzip >/opt/$(date +%F).sql.gz

      5.  只需要在从库上导入全备,change master的时候不需要指定binlog文件名和位置。

13.  一键批量创建从库

      1.  还原备份到从库上

      2.  写脚本执行change master

      3.  写脚本执行start slave

      4.  检查主从状态

14.  mysql主从复制三个线程状态

      1.  主库:

          show processlist \G;

1
2
3
4
5
6
7
8
9
* * * * * * * * * * * * * * * * * * * * * * * * * * *  2.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * *
      Id 4
    User: rep
    Host: nfs - server: 35652
      db: NULL
Command: Binlog Dump
    Time:  2246
   State: Master has sent  all  binlog to slave; waiting  for  binlog to be updated
    Info: NULL

      2.  从库

          show processlist \G;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
* * * * * * * * * * * * * * * * * * * * * * * * * * *  1.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * *
      Id 1
    User: system user
    Host:
      db: NULL
Command: Connect
    Time:  2277
   State: Slave has read  all  relay log; waiting  for  the slave I / O thread to update it
    Info: NULL
* * * * * * * * * * * * * * * * * * * * * * * * * * *  2.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * *
      Id 2
    User: system user
    Host:
      db: NULL
Command: Connect
    Time:  2285
   State: Waiting  for  master to send event
    Info: NULL

          show slave status \G;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
* * * * * * * * * * * * * * * * * * * * * * * * * * *  1.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * *
                Slave_IO_State: Waiting  for  master to send event
                   Master_Host:  192.168 . 0.200
                   Master_User: rep
                   Master_Port:  3306
                 Connect_Retry:  60
               Master_Log_File: mysql - bin . 000010
           Read_Master_Log_Pos:  120
                Relay_Log_File: mysqld - relay - bin . 000006
                 Relay_Log_Pos:  283
         Relay_Master_Log_File: mysql - bin . 000010
              Slave_IO_Running: Yes  从库的IO线程
             Slave_SQL_Running: Yes  从库的SQL线程
               Replicate_Do_DB:
           Replicate_Ignore_DB:
            Replicate_Do_Table:
        Replicate_Ignore_Table:
       Replicate_Wild_Do_Table:
   Replicate_Wild_Ignore_Table:
                    Last_Errno:  0
                    Last_Error:
                  Skip_Counter:  0
           Exec_Master_Log_Pos:  120
               Relay_Log_Space:  620
               Until_Condition:  None
                Until_Log_File:
                 Until_Log_Pos:  0
            Master_SSL_Allowed: No
            Master_SSL_CA_File:
            Master_SSL_CA_Path:
               Master_SSL_Cert:
             Master_SSL_Cipher:
                Master_SSL_Key:
         Seconds_Behind_Master:  0   落后主库的秒数
Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno:  0
                 Last_IO_Error:
                Last_SQL_Errno:  0
                Last_SQL_Error:
   Replicate_Ignore_Server_Ids:
              Master_Server_Id:  3306
                   Master_UUID: a027a03c - 7df9 - 11e8 - 92fc - 000c296cbf3b
              Master_Info_File:  / data / 3307 / data / master.info
                     SQL_Delay:  0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: Slave has read  all  relay log; waiting  for  the slave I / O thread to update it
            Master_Retry_Count:  86400
                   Master_Bind:
       Last_IO_Error_Timestamp:
      Last_SQL_Error_Timestamp:
                Master_SSL_Crl:
            Master_SSL_Crlpath:
            Retrieved_Gtid_Set:
             Executed_Gtid_Set:
                 Auto_Position:  0
1  row  in  set  ( 0.00  sec)

15.  mysql错误代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
MySQL常见错误代码及代码说明
 
1005 :创建表失败
1006 :创建数据库失败
1007 :数据库已存在,创建数据库失败< = = = = = = = = = = = = = = = = = 可以忽略
1008 :数据库不存在,删除数据库失败< = = = = = = = = = = = = = = = = = 可以忽略
1009 :不能删除数据库文件导致删除数据库失败
1010 :不能删除数据目录导致删除数据库失败
1011 :删除数据库文件失败
1012 :不能读取系统表中的记录
1020 :记录已被其他用户修改
1021 :硬盘剩余空间不足,请加大硬盘可用空间
1022 :关键字重复,更改记录失败
1023 :关闭时发生错误
1024 :读文件错误
1025 :更改名字时发生错误
1026 :写文件错误
1032 :记录不存在< = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 可以忽略
1036 :数据表是只读的,不能对它进行修改
1037 :系统内存不足,请重启数据库或重启服务器
1038 :用于排序的内存不足,请增大排序缓冲区
1040 :已到达数据库的最大连接数,请加大数据库可用连接数
1041 :系统内存不足
1042 :无效的主机名
1043 :无效连接
1044 :当前用户没有访问数据库的权限
1045 :不能连接数据库,用户名或密码错误
1048 :字段不能为空
1049 :数据库不存在 < = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 可以忽略
1050 :数据表已存在
1051 :数据表不存在
1054 :字段不存在
1062 :字段值重复,入库失败< = = = = = = = = = = = = = = = = = = = = = = = = = = 可以忽略
1065 :无效的SQL语句,SQL语句为空
1081 :不能建立Socket连接
1114 :数据表已满,不能容纳任何记录
1116 :打开的数据表太多
1129 :数据库出现异常,请重启数据库
1130 :连接数据库失败,没有连接数据库的权限
1133 :数据库用户不存在
1141 :当前用户无权访问数据库
1142 :当前用户无权访问数据表
1143 :当前用户无权访问数据表中的字段
1146 :数据表不存在 < = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 可以忽略
1147 :未定义用户对数据表的访问权限
1149 :SQL语句语法错误
1158 :网络错误,出现读错误,请检查网络连接状况
1159 :网络错误,读超时,请检查网络连接状况
1160 :网络错误,出现写错误,请检查网络连接状况
1161 :网络错误,写超时,请检查网络连接状况
1169 :字段值重复,更新记录失败
1177 :打开数据表失败
1180 :提交事务失败
1181 :回滚事务失败
1203 :当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库
1205 :加锁超时
1211 :当前用户没有创建用户的权限
1216 :外键约束检查失败,更新子表记录失败
1217 :外键约束检查失败,删除或修改主表记录失败
1226 :当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器
1227 :权限不足,您无权进行此操作
1235 :MySQL版本过低,不具有本功能

16.  mysql主从复制读写分离授权方案

    1.  生产授权方案1

        主:web oldboy123 10.0.0.1 3306 (select,insert,delete,update)

                            从:主库的web用户同步到从库,然后回收insert,delete,update权限。

        不收回从库权限,设置read-only参数确保从库只读。

    2.  生产授权方案2

        主:web_w oldboy123 10.0.0.1 3306 (select,insert,delete,update)

        从:web_r oldboy123 10.0.0.2 3306 (select)

        风险:web_w连接从库,设置read-only参数确保从库只读

    3.  生产授权方案3

        不同步授权库mysql

17.  忽略授权表

    1.  在/data/3306/my.cnf配置文件的mysqld模块中,添加如下信息:

binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema

注意:是在主库上添加的参数。这样就不会复制到从库,减少I/O。

18.  mysql主从复制指定库的复制

    1.  在配置文件中,添加binlog-do-db = yangjianbo,test

19.  mysql主从复制只读

    1.  在配置文件的mysqld中,添加:

        read-only

        重启mysql服务。

    2.  注意:具有SUPER权限的用户可以更新,不受read-only参数影响

          来自从服务器线程可以更新,例如创建的rep账户。

20.  mysql主从复制故障

    1.  从库已经存在的数据库,主库无法同步同名的数据库。

        查看show slave status\G;

                             Last_SQL_Error: Error 'Can't create database 'wangyanhe'; database exists' on query. Default database: 'wangyanhe'. Query: 'create database wangyanhe'

        解决方法一:

        stop slave;

        set global sql_slave_skip_counter = 1;

                            start slave;

        解决方法二:

        提前把错误号写入到my.cnf配置文件中。

        slave-skip-errors = 1032,1062,1007

    2.  mysql连接慢

        skip-name-resolve

21.  mysql从库记录binlog日志的方法

    1.  级联同步

    2.  从库作为备份服务器

    3.  启动log-bin = /data/3307/mysql-bin

        log-slave-updates

        expire_logs_days = 7 

22.  一主多从 主宕机 从切换为主 继续同步

    1.  检查所有从库

        show processlist;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> show processlist \G
* * * * * * * * * * * * * * * * * * * * * * * * * * *  1.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * *
      Id 10
    User: system user
    Host:
      db: NULL
Command: Connect
    Time:  529
   State: Waiting  for  master to send event
    Info: NULL
* * * * * * * * * * * * * * * * * * * * * * * * * * *  2.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * *
      Id 11
    User: system user
    Host:
      db: NULL
Command: Connect
    Time:  528
   State: Slave has read  all  relay log; waiting  for  the slave I / O thread to update it
    Info: NULL

    2.  检查所有从库的master.info

        看哪个更新,选择最大的bin-log和位置点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@nfs - server data] # cat master.info
23
mysql - bin . 000011
464
192.168 . 0.200
rep
123
3306
60
0
 
 
 
 
 
0
1800.000
 
0
a027a03c - 7df9 - 11e8 - 92fc - 000c296cbf3b
86400
 
 
0

    3.  确保所有relay log全部更新完毕

        在每个从库上执行stop slave io_thread;

        show processlist \G;  直到看到下面的信息

1
2
3
4
5
6
7
8
      Id 11
    User: system user
    Host:
      db: NULL
Command: Connect
    Time:  833
   State: Slave has read  all  relay log; waiting  for  the slave I / O thread to update it
    Info: NULL

    4.  登录从库

        stop slave;

        reset master

    5.  进入数据库数据目录,删除master.info relay-log.info

       检查授权表,清除read-only参数

    6.  开启bin-log,如果存在log-slave-updates read-only一定要注释掉

        /data/3307/mysql restart

    7.  如果主库没有宕机,需要去主库拉取binlog补全提升主库的从库

    8.  其他从库配置

        stop slave;    

1
2
CHANGE MASTER TO
MASTER_HOST = '192.168.0.200' ,  指向新的主库

        start slave;

        show slave status \G;

    9.  修改web前端代码的数据库连接串地址

    10.  修理损坏的主库,作为新主库的从库.

23.  从库宕机

    stop slave;

1
2
CHANGE MASTER TO
MASTER_HOST = '192.168.0.200' ,<br>start slave;

24.  双主及多主

    1.  配置my.cnf的自增长

    2.  主库与从库做个反向主从复制

25.  mysql备份与还原

    1.  mysqldump命令是mysql自带的命令.

       语法:  mysqldump -u root -p123456 数据库名 > /opt/数据库名.sql

       例子:  mysqldump -uroot -p123456 yangjianbo -S /data/3306/mysql.sock > /opt/yangjianbo.sql

    2.  mysql的还原

       语法:  mysql -uroot -p123456 数据名< /opt/数据库名.sql  前提是:必须存在数据名

       例子:  mysql -uroot -p123456 gaozhongming -S /data/3306/mysql.sock < /opt/yangjianbo.sql

    3.  备份时带有参数-B

       语法:  mysqldump -u root -p123456 yangjianbo -S /data/3306/mysql.sock -B> /opt/yangjianbo.sql  

       作用:  带有-B的参数备份,yangjianbo.sql语句中会有创建库和使用库的命令。

       例子:  mysqldump -u root -p123456 yangjianbo -S /data/3306/mysql.sock -B> /opt/yangjianbo.sql

    4.  还原时带有参数的备份文件

       语法:  mysql -uroot -p123456  -S /data/3306/mysql.sock </opt/yangjianbo.sql

    5.  mysqldump的逻辑备份工作原理

       把创建库和表,插入的数据的sql导出到一个文件中,然后还原的时候,把这些sql语句重新执行一下。

    6.  备份多个库

       mysqldump -uroot -p123456 -B yangjianbo wangyanhe -S /data/3306/mysql.sock > /opt/a.sql  多个库用空格隔开

    7.  还原多个库

       mysql -uroot -p123456 -S /data/3306/mysql.sock < /opt/a.sql

    8.  如何做分库备份

       执行备份语句备份多个库

       1.  方法一:

1
mysql  - uroot  - p123456  - / data / 3306 / mysql.sock  - "show databases;"  | grep  - Evi  "info|perfor|database"  | sed  - 's#^([a-z].*$)#mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B \1|gzip >/opt/\1.sql.gz#g' |bash

       2.  方法二:

          使用for循环,执行mysqldump命令。

          后续写出来这个脚本。

          参考视频:http://edu.51cto.com/course/808.html

1
2
3
4
5
6
[root@nfs - server bak] # cat /server/scripts/fenku.sh
#!/bin/bash
for  in  `mysql  - uroot  - p123456  - / data / 3306 / mysql.sock  - "show databases;"  | grep  - Evi  "info|perfor|database" `
do
   mysqldump  - uroot  - p123456   - / data / 3306 / mysql.sock  - B $i | gzip > / opt / bak / ${i}_bak.sql.gz
done

    9.  备份库中的某个表

          语法:mysqldump -uroot -p123456 -S /data/3306/mysql.sock 库名 表1 表2 > /opt/a.sql

          mysqldump -uroot -p12345 -S /data/3306/mysql.sock yangjianbo yang

          多个表: mysqldump -uroot -p123456 -S /data/3306/mysql.sock yangjianbo yang zhang >/opt/bak/yangjianb_yang.sql           

          还原测试:mysql -uroot -p123456 -S /data/3306/mysql.sock yangjianbo </opt/bak/yangjianb_yang.sql 要指定哪个库

    10.  常见参数

          -d:  备份数据表结构

            mysqldump -uroot -p123456 -S /data/3306/mysql.sock -d yangjianbo yang >/opt/a.sql

1
2
3
4
5
[root@nfs - server opt] # grep -Ev '^/|^-|^$' a.sql
DROP TABLE IF EXISTS `yang`;
CREATE TABLE `yang` (
   ` id int ( 11 ) DEFAULT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8;

          -t:  只备份表数据

            mysqldump -uroot -p123456 -S /data/3306/mysql.sock -t yangjianbo yang >/opt/b.sql

1
2
3
4
[root@nfs - server opt] # grep -Ev '^/|^-|^$' b.sql
LOCK TABLES `yang` WRITE;
INSERT INTO `yang` VALUES ( 1 );
UNLOCK TABLES;      

          -F:  刷新binlog

             mysqldump -uroot -p123456 -S /data/3306/mysql.sock -A -B -F >/opt/all.sql

          --master-data:   自动找到binlog的位置

             mysqldump -uroot -p123456 -S /data/3306/mysql.sock --master-data=1 -A -B > /opt/all_master_data.sql

          -A:  备份所有库

          -B:  包含create database和use database的命令

          -x:   锁表

          --single-transaciton:   通过启动该选项来备份InnoDB表.

    11.  myisam引擎

          备份:mysqldump -uroot -p123456   -A  -B  --master-data=1  -x  --events   | gzip   > /opt/all.sql.gz

    12.  Innodb引擎

          备份:mysqldump -uroot -p123456 -A -B --master-data=1    --events  --single-transaction  | gzip   > /opt/all/sql.gz

    13.  source命令恢复数据库

          进入到mysql数据库中,使用source命令还原数据库。

          source /opt/bak/yangjianbo_bak.sql;  使用绝对路径

          source yangjianbo_bak.sql;  使用相对路径,就是登录mysql的那个路径

    14.  mysql恢复数据库命令

          mysql -uroot -p123456 -S /data/3306/mysql.sock yangjianbo < /opt/bak/yangjianbo_bak.sql;

    15.  mysql分库恢复数据库

          把所有的库进行解压,通过sed命令获取数据库名称。

          使用for循环把数据库还原到mysql中。    

    16.  mysql参数-e

          mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show databases;

    17.  show processlist;

          mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show full processlist;"

          mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show processlist;"

    18.  show variables;  查看数据库的参数信息

          mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show variables;" | grep log_bin                 

    19.  show global status;  查看整个数据库运行状态信息,很重要

          mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show global status;" | grep insert

    20.  show status;  查看当前会话状态信息

    21.  show full processlist;  查看正在运行的完整sql语句。重要

26.  mysqlbinlog命令

    1.  作用:解析mysql的binlog日志

    2.  binlog文件

        位置:/data/3306/mysql-bin.000001

        作用:用来记录mysql内部增删改查等对mysql数据库有更新的内容的记录,只查不改不记录。

    3.  使用mysqlbinlog查看

        mysqlbinlog mysql-bin.000016

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/ * ! 50530  SET  @@SESSION.PSEUDO_SLAVE_MODE = 1 * / ;
/ * ! 40019  SET  @@session.max_insert_delayed_threads = 0 * / ;
/ * ! 50003  SET  @OLD_COMPLETION_TYPE = @@COMPLETION_TYPE,COMPLETION_TYPE = 0 * / ;
DELIMITER  / * ! * / ;
# at 4
#180722 23:21:41 server id 3306  end_log_pos 120 CRC32 0xf4acd393       Start: binlog v 4, server v 5.6.40-log created 180722 23:21:41
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
BaFUWw / qDAAAdAAAAHgAAAABAAQANS42LjQwLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAZPT
rPQ =
' / * ! * / ;
# at 120
#180723  0:04:02 server id 3306  end_log_pos 298 CRC32 0xd34e5886       Query   thread_id=96     exec_time=0     error_code=0
SET  TIMESTAMP = 1532275442 / * ! * / ;
SET  @@session.pseudo_thread_id = 96 / * ! * / ;
SET  @@session.foreign_key_checks = 0 , @@session.sql_auto_is_null = 0 , @@session.unique_checks = 0 , @@session.autocommit = 1 / * ! * / ;
SET  @@session.sql_mode = 524288 / * ! * / ;
SET  @@session.auto_increment_increment = 1 , @@session.auto_increment_offset = 1 / * ! * / ;
/ * !\C utf8  * / / * ! * / ;
SET  @@session.character_set_client = 33 ,@@session.collation_connection = 33 ,@@session.collation_server = 33 / * ! * / ;
SET  @@session.lc_time_names = 0 / * ! * / ;
SET  @@session.collation_database = DEFAULT / * ! * / ;
CREATE DATABASE  / * ! 32312  IF NOT EXISTS * /  `yangjianbo`  / * ! 40100  DEFAULT CHARACTER  SET  utf8  * /
/ * ! * / ;
# at 298
#180723  0:04:02 server id 3306  end_log_pos 437 CRC32 0xe81222d2       Query   thread_id=96     exec_time=0     error_code=0
use `yangjianbo` / * ! * / ;
SET  TIMESTAMP = 1532275442 / * ! * / ;
DROP TABLE IF EXISTS `yang`  / *  generated by server  * /
/ * ! * / ;
# at 437
#180723  0:04:02 server id 3306  end_log_pos 609 CRC32 0xaf397ef6       Query   thread_id=96     exec_time=1     error_code=0
SET  TIMESTAMP = 1532275442 / * ! * / ;
CREATE TABLE `yang` (
   ` id int ( 11 ) DEFAULT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8
/ * ! * / ;
# at 609
#180723  0:04:03 server id 3306  end_log_pos 738 CRC32 0xaaca9d90       Query   thread_id=96     exec_time=0     error_code=0
SET  TIMESTAMP = 1532275443 / * ! * / ;
/ * ! 40000  ALTER TABLE `yang` DISABLE KEYS  * /
/ * ! * / ;
# at 738
#180723  0:04:03 server id 3306  end_log_pos 829 CRC32 0xfbedcda5       Query   thread_id=96     exec_time=0     error_code=0
SET  TIMESTAMP = 1532275443 / * ! * / ;
BEGIN
/ * ! * / ;
# at 829
#180723  0:04:03 server id 3306  end_log_pos 944 CRC32 0x48a04b08       Query   thread_id=96     exec_time=0     error_code=0
SET  TIMESTAMP = 1532275443 / * ! * / ;
INSERT INTO `yang` VALUES ( 1 )

    4.   把binlog内容导出一下。

          mysqlbinlog mysql-bin.000016 >all.sql  把所有库的所有表的修改导出

          mysqlbinlog -d yangjianbo mysql-bin.000016 >yangjianbo.sql  指定库的修改导出

          mysql -uroot -p123456  yangjianbo <yangjianbo.sql

    5.  指定开始位置和结束位置

          mysqlbinlog mysql-bin.000016 --start-position=123 --stop-position=456 -r a.sql

    6.  指定开始时间和结束时间

          mysqlbinlog mysql-bin.000016 --start-datetime='2018-07-23 0:36:50' --stop-datetime='2018-07-23 05:03:50' -r b.sql

27.  --master-data作用

    1.  --master-data=2  带注释change master to 

    2.  --master-data=1  用于主从复制                

30.  Mysql的优化

    1.  硬件优化

        1.  CPU  8-16颗CPU

        2.  内存  64位CPU 96-128G 3-4实例  32G-64G  跑2个实例

        3.  硬盘  数量越多越好  性能:ssd(高并发) > sas(普通业务,线上) > sata(线下)

        4.  raid  RAID0>RAID10>RAID5>RAID1

        5.  网卡  bond

    2.  软件优化

        1.  操作系统  64位系统

        2.  mysql  编译安装,编译优化

    3.  参数优化my.cnf

        1.  innodb_buffer_pool_size  配置到物理内存30~50%

        2.  innodb_file_io_threads

        3.  innodb_thread_concurrency

        4.  innodb_flush_log

        5.  sort_buffer_size=2M

        6.  join_buffer_size

        7.  read_buffer_size

        8.  open_files_limit=10240

        9.  skip_name_resolve(遇到问题)

        10.  监控:show global status\G

            调优工具:mysqlreport

    3.  SQL语句的优化

        1.  索引优化

            1)  抓出慢sql,配置my.cnf。

            慢查询日志分析工具  mysqlsla最好的工具

            mysqldumpslow,mysqlsla,myprofi,mysql-explain-slow-log,mysqllogfilter

        2.  大的复杂的sql语句拆分成多个小的sql语句

        3.  搜索功能

    4.  架构的优化

    5.  流程制度安全优化

31.  mysql语句

    1.  修改表字段类型

        mysql> alter table 表名 modify column 字段名 类型;

        alter table address modify column city char(30);

1.  Mysql的安装方式

    1.  yum安装mysql

        适合对数据库要求不太高的场合,例如:并发不大,公司内部,企业内部。

        1.  官网下载yum源,wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

        2.  rpm -ivh rpm包文件

        3.  安装这个包后,会获得两个mysql的yum repo源:/etc/yum.repos.d/mysql-community.repo,/etc/yum.repos.d/mysql-community-source.repo。

        4.  yum install mysql-server -y

        5.  启动systemctl start mysqld.service

        6.  登录mysql -uroot -p

    2.  二进制方式安装mysql

        很多专业DBA的选择

        1.  下载指定版本的二进制文件包。

            cd /home/tools

            wget https://cdn.mysql.com//Downloads/MySQL-5.6/mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz

        2.  解压压缩包

            tar -zxvf mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz

        3.  将文件包移动到/application下,并且创建一个软链接到/usr/local/mysql

            mv mysql-5.6.40-linux-glibc2.12-x86_64 /application

            ln -s /application/mysql-5.6.40-linux-glibc2.12-x86_64/   /application/mysql

        4.  创建一个mysql用户和组

            useradd -s /sbin/nologin -M mysql

        5.  将/application/mysql/下的所有目录属主和属组都设置为mysql。

            chown -R mysql.mysql /application/mysql/

        6.  初始化mysql

            scripts/mysql_install_db --user=mysql

            报错:

FATAL ERROR: please install the following Perl modules before executing scripts/mysql_install_db:

Data::Dumper

            解决方法:

               yum install autoconf -y

               再次执行初始化,没有这个报错了。又有其他报错。

WARNING: Found existing config file ./my.cnf on the system.
Because this file might be in use, it was not replaced,

把/etc/my.cnf文件删掉,再执行初始化。

然后检查data目录下,是不是有下面的文件。   

-rw-rw---- 1 mysql mysql 12582912 6月 17 01:21 ibdata1
-rw-rw---- 1 mysql mysql 50331648 6月 17 01:21 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 6月 17 01:18 ib_logfile1
drwx------ 2 mysql mysql 4096 6月 17 01:18 mysql
drwx------ 2 mysql mysql 4096 6月 17 01:21 performance_schema
drwxr-xr-x 2 mysql mysql 19 6月 15 01:40 test

               也可以通过查看data/机器名.err

        7.  把当前目录的用户设置为root。  

            chown -R root .     

        8.  把data目录的属主设置为mysql.

            chown -R mysql data 

drwxr-xr-x 2 root mysql 4096 6月 15 01:40 bin
-rw-r--r-- 1 root mysql 17987 2月 26 20:46 COPYING
drwxr-xr-x 5 mysql mysql 104 6月 17 01:21 data
drwxr-xr-x 2 root mysql 52 6月 15 01:40 docs
drwxr-xr-x 3 root mysql 4096 6月 15 01:39 include
drwxr-xr-x 3 root mysql 4096 6月 15 01:40 lib
drwxr-xr-x 4 root mysql 28 6月 15 01:40 man
-rw-r--r-- 1 root root 943 6月 17 01:21 my.cnf
-rw-r--r-- 1 root root 943 6月 17 01:19 my-new.cnf
drwxr-xr-x 10 root mysql 4096 6月 15 01:40 mysql-test
-rw-r--r-- 1 root mysql 2496 2月 26 20:46 README
drwxr-xr-x 2 root mysql 29 6月 15 01:40 scripts
drwxr-xr-x 28 root mysql 4096 6月 15 01:40 share
drwxr-xr-x 4 root mysql 4096 6月 15 01:39 sql-bench
drwxr-xr-x 2 root mysql 130 6月 15 01:39 support-files

             9.  cp support-files/mysql.server /etc/init.d/mysqld

          10.  sed -i 's#/usr/local/mysql#/application/mysql#g'  /application/mysql/bin/mysqld_safe   /etc/init.d/mysqld

          11.  /etc/init.d/mysqld start

      或者后台启动mysql

    bin/mysqld_safe --user=mysql &

[root@rsync-server mysql]# ps -ef | grep mysql | grep -v "grep"
root 5509 1530 0 01:30 pts/2 00:00:00 /bin/sh bin/mysqld_safe --user=mysql
mysql 5590 5509 1 01:30 pts/2 00:00:01 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=rsync-server.err --pid-file=rsync-server.pid

使用mysqld_safe启动的原因:它是mysqld的守护进程,当mysqld被强制关闭,mysqld_safe会自动启动一个新的进程mysqld。 

         11.  把/application/mysql/bin添加到环境变量

              echo "export PATH=/application/mysql/bin:$PATH"  >>/etc/profile

              source /etc/profile

         12.  清理无用的账户及库

              drop user "root"@"::1";

              drop user ""@"localhost";

              drop user ""@"www";

              drop user "root"@"www";

              flush privileges;

              drop database test;

    3.  二进制安装mysql5.7版本

          

    4.  编译安装mysql

        普通运维人员采用编译的方式。

        编译安装5.6.40版本。

        1.  准备工作

           yum install ncurses-devel libaio-devel -y

           rpm -qa ncurses-devel libaio-devel 

        2.  yum install cmake -y

        3.  useradd -a /sbin/nologin -M mysql

        4.  cd /home/tools

           wget https://cdn.mysql.com//Downloads/MySQL-5.6/mysql-5.6.40.tar.gz

           tar -zxvf mysql-5.6.40.tar.gz

        5.  cd mysql-5.6.40

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cmake .  - DCMAKE_INSTALL_PREFIX = / application / mysql - 5.6 . 40  \
- DMYSQL_DATADIR = / application / mysql - 5.6 . 40 / data \
- DSYSCONFDIR = / etc \
- DWITH_MYISAM_STORAGE_ENGINE = 1  \
- DWITH_INNOBASE_STORAGE_ENGINE = 1  \
- DWITH_MEMORY_STORAGE_ENGINE = 1  \
- DWITH_READLINE = 1  \
- DMYSQL_UNIX_ADDR = / application / mysql - 5.6 . 40 / tmp / mysql.sock \
- DMYSQL_TCP_PORT = 3306  \
- DENABLED_LOCAL_INFILE = 1  \
- DWITH_PARTITION_STORAGE_ENGINE = 1  \
- DEXTRA_CHARSETS = all  \
- DDEFAULT_CHARSET = utf8 \
- DDEFAULT_COLLATION = utf8_general_ci \
- DMYSQL_USER = mysql \
- DWITH_DEBUG = 0  \
- DWITH_SSL = system

        6.  make  这个时间比较长

        7.  make install  

    建议:版本首选5.5以上,安装机器数量少,选择编译;数量多,选择二进制方式。

2.  Mysql的多实例

    1.  Mysql多实例共用一套Mysql安装程序,使用不同的my.cnf配置文件,启动程序,数据文件。

        多实例逻辑上是独立的,但是实际上使用的是同一台服务器资源。

        nginx,apache,haproxy,redis,memcache,都可以多实例。

    2.  Mysql多实例的作用与问题

        1.  有效利用服务器资源

        2.  节约服务器资源

        3.  问题:当某个实例并发很高或者有慢查询的时候,整个实例会消耗服务器的CPU,内存,磁盘IO资源。

    3.  Mysql多实例的应用场景

        1.  资金紧张型公司

        2.  并发访问不是特别大的业务

        3.  百度搜索引擎的数据库就是多实例,一般是从库。

    4.  Mysql多实例的多种配置方案

        1.  多个配置文件多个启动程序多个数据文件

            pkill mysqld  杀死原有的mysqld

            mkdir -p /data/{3306,3307}/data  创建多个实例的数据文件

        2.  单一配置文件

            缺点:耦合性太高

    5.  配置过程

        1.  编译安装完成mysql-5.6.40以后,开始创建配置文件和数据文件和启动文件。

           mkdir -p /data/{3306,3307}/data

        2.  在/data/3306和/data/3307目录下创建多实例的配置文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[mysqld]
basedir = / application / mysql
datadir = / data / 3306 / data
server - id = 3306
port = 3306
log - bin = / data / 3306 / mysql - bin
socket = / data / 3306 / mysql.sock
max_allowed_packet = 8M
sort_buffer_size = 1M
join_buffer_size = 1M
max_connections = 800
max_connect_errors = 3000
#table_cache=614
external - locking = FALSE
thread_cache_size = 100
thread_concurrency = 2
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
ft_min_word_len  =  4      
default - storage - engine  =  InnoDB
thread_stack  =  192K                   
transaction_isolation  =  REPEATABLE - READ
tmp_table_size  =  64M                                   
binlog_format = mixed                   
slow_query_log                 
long_query_time  =  2
key_buffer_size  =  32M                
bulk_insert_buffer_size  =  64M          
myisam_sort_buffer_size  =  128M        
myisam_max_sort_file_size  =  10G      
myisam_repair_threads  =  1            
myisam_recover
innodb_additional_mem_pool_size  =  16M
innodb_buffer_pool_size  =  2G           
innodb_data_file_path  =  ibdata1: 10M :autoextend
innodb_write_io_threads  =  8       
innodb_read_io_threads  =  8
innodb_flush_log_at_trx_commit  =  1    
innodb_log_buffer_size  =  8M           
innodb_log_file_size  =  256M           
innodb_log_files_in_group  =  3         
innodb_max_dirty_pages_pct  =  90       
innodb_lock_wait_timeout  =  120               
[mysqld_safe]
log - error = / data / 3306 / mysql_oldboy3306.err
pid - file = / data / 3306 / mysqld.pid   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[mysqld]
basedir = / application / mysql
datadir = / data / 3307 / data
server - id = 3307
port = 3307
log - bin = / data / 3307 / mysql - bin
socket = / data / 3307 / mysql.sock
max_allowed_packet = 8M
sort_buffer_size = 1M
join_buffer_size = 1M
max_connections = 800
max_connect_errors = 3000
#table_cache=614
external - locking = FALSE
thread_cache_size = 100
thread_concurrency = 2
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
ft_min_word_len  =  4      
default - storage - engine  =  InnoDB
thread_stack  =  192K                   
transaction_isolation  =  REPEATABLE - READ
tmp_table_size  =  64M                                    
binlog_format = mixed                   
slow_query_log                 
long_query_time  =  2
key_buffer_size  =  32M                
bulk_insert_buffer_size  =  64M          
myisam_sort_buffer_size  =  128M        
myisam_max_sort_file_size  =  10G      
myisam_repair_threads  =  1            
myisam_recover
innodb_additional_mem_pool_size  =  16M
innodb_buffer_pool_size  =  2G           
innodb_data_file_path  =  ibdata1: 10M :autoextend
innodb_write_io_threads  =  8       
innodb_read_io_threads  =  8
innodb_flush_log_at_trx_commit  =  1    
innodb_log_buffer_size  =  8M           
innodb_log_file_size  =  256M           
innodb_log_files_in_group  =  3         
innodb_max_dirty_pages_pct  =  90       
innodb_lock_wait_timeout  =  120               
[mysqld_safe]
log - error = / data / 3307 / mysql_oldboy3307.err
pid - file = / data / 3307 / mysqld.pid

      3.  启动文件内容/data/3306/mysql和/data/3307/mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@nfs - server  3306 ] # cat mysql
#!/bin/bash
###################################################
#yangjianbo created
port = 3306
mysql_user = "root"
mysql_pwd = "123"
CmdPath = "/application/mysql/bin"
mysql_sock = "/data/${port}/mysql.sock"
#start function
function_start_mysql()
{
    if  [ !  - "$mysql_sock"  ];then
      printf  "Starting Mysql...\n"
        / bin / sh ${CmdPath} / mysqld_safe  - - defaults - file = / data / ${port} / my.cnf  2 >& 1  > / dev / null &
    else
      printf  "Mysql is running...\n"
      exit
    fi
}
 
#stop function
function_stop_mysql()
{
    if  [ !  - "$mysql_sock"  ];then
      printf  "Mysql is stopped...\n"
      exit
    else
      printf  "Stopping Mysql...\n"
      ${CmdPath} / mysqladmin  - u ${mysql_user}  - p${mysql_pwd}  - / data / ${port} / mysql.sock shutdown
    fi
}
 
#restart function
function_restart_mysql()
{
    printf  "Restarting Mysql...\n"
    function_stop_mysql
    sleep  2
    function_start_mysql
}
 
case $ 1  in
start)
    function_start_mysql
;;
stop)
    function_stop_mysql
;;
restart)
    function_restart_mysql
;;
* )
    printf  "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@nfs - server  3307 ] # cat mysql
#!/bin/bash
###################################################
#yangjianbo created
port = 3307
mysql_user = "root"
mysql_pwd = "123"
CmdPath = "/application/mysql/bin"
mysql_sock = "/data/${port}/mysql.sock"
#start function
function_start_mysql()
{
    if  [ !  - "$mysql_sock"  ];then
      printf  "Starting Mysql...\n"
        / bin / sh ${CmdPath} / mysqld_safe  - - defaults - file = / data / ${port} / my.cnf  2 >& 1  > / dev / null &
    else
      printf  "Mysql is running...\n"
      exit
    fi
}
 
#stop function
function_stop_mysql()
{
    if  [ !  - "$mysql_sock"  ];then
      printf  "Mysql is stopped...\n"
      exit
    else
      printf  "Stopping Mysql...\n"
      ${CmdPath} / mysqladmin  - u ${mysql_user}  - p${mysql_pwd}  - / data / ${port} / mysql.sock shutdown
    fi
}
 
#restart function
function_restart_mysql()
{
    printf  "Restarting Mysql...\n"
    function_stop_mysql
    sleep  2
    function_start_mysql
}
 
case $ 1  in
start)
    function_start_mysql
;;
stop)
    function_stop_mysql
;;
restart)
    function_restart_mysql
;;
* )
    printf  "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac

     4.  初始化多实例的数据库文件

        cd /application/mysql/scripts

        ./mysql_install_db --defaults-file=/data/3306/my.cnf --basedir=/application/mysql --datadir=/data/3306/data --user=mysql

        ./mysql_install_db --defaults-file=/data/3307/my.cnf --basedir=/application/mysql --datadir=/data/3307/data --user=mysql

        出现下面的结果:

           出现两个OK,没有error级别的错误即可。

          初始化的目的:创建基础的数据库系统的库文件。创建完成后,会在/data/3306/data和/data/3307/data目录下创建很多文件。

     5.  启动多实例

          /data/3306/mysql start

          /data/3307/mysql start

          启动的时候报错:

          Starting MySQL.170814 20:02:33 mysqld_safe error: log-error set to '/data/3306/mysql_oldboy3306.err', however file don't exists. Create writable for user 'mysql'.

          解决方法:

          手工创建该文件  touch /data/3306/mysql_oldboy3306.err

          授权  chown mysql.mysql /data/3306/mysql_oldboy3306.err

     6.  检查是否启动成功

          lsof -i:3306

          lsof -i:3307

          netstat -lntup | grep 330

     7.  多实例排错

          查看log-error日志

          /data/3306/mysql_oldboy3306.err

     8.  设置root密码

          第一次登录,是没有密码的。5.7以后需要密码。

          mysqladmin -u root -S /data/3306/mysql.sock password '123'

          mysqladmin -u root -S /data/3306/mysql.sock password '123'

     9.  登录多实例

          本地登录

            mysql -uroot -p -S /data/3306/mysql.sock

          远程登录

            mysql -uroot -p -h 数据库IP -P 3307

     10.  设置开机启动

          centos6

            添加到/etc/rc.local文件中

            /data/3306/mysql start

            /data/3307/mysql start

          centos7

            添加到systemd中

     11.  如何再增加一个mysql实例

          创建对应的目录

          复制配置文件和启动文件,并修改内容

          初始化数据库

          授权

          启动mysql

          设置root密码

3.  Mysql的帮助命令help

      1.  与linux的man命令一样

         进入mysql实例中,然后执行help show

4.  修改mysql密码

      1.  在系统中修改mysqladmin -uroot -p123 password 'yangjianbo' -S /data/3306/mysql.sock

      2.  登录到mysql中,修改账户的密码

         update user set password=password(456) where user='root' and host='localhost';

         flush privileges;

      3.  第一次登录密码为空,进入以后,设置root密码。

         set password=password('123');

         flush privileges;

5.  丢失mysql密码

       先停止数据库

在配置文件中,[mysqld]下面,添加一条内容:skip-grant-tables

然后启动mysql。

以空密码进去,修改root密码。

mysql 5.7

update mysql.user set authentication_string=password('*******') where user='root';

flush privileges; 

mysql 5.5

updatet user set password=password("*****") where user="root";

flush privileges;

       这种方法不只是针对root用户,所有用户都免密码了。  

6.  SQL结构化查询语言

    1.  分类

        DQL  数据查询语言  主要是select

        DDL  数据定义语言  主要是create drop

        DML  数据操作语言  主要是insert delete update

        TPL  事物处理语言  主要是BEGIN TRAN COMMIT ROLLBACK

        DCL  数据控制语言  主要是GRANT REVOKE

        CCL  指针控制语言  DECLARE FETCH

7.  Mysql创建数据库

    1.  创建数据库

        create database yangjianbo;

    2.  查看数据库详细信息

        show create database yangjianbo \G;

1
2
3
4
5
mysql> show create database yangjianbo \G
* * * * * * * * * * * * * * * * * * * * * * * * * * *  1.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * *
        Database: yangjianbo
Create Database: CREATE DATABASE `yangjianbo`  / * ! 40100  DEFAULT CHARACTER  SET  utf8  * /
1  row  in  set  ( 0.00  sec)    默认的字符集为utf8

    3.  创建字符集为GBK的数据库

        create database wangyanhe CHARACTER SET=gbk COLLATE=gbk_chinese_ci;

        如果使用的是编译安装,参数中已经有了字符集的设定,那么默认创建的数据库使用的就是你编译的字符集。        

    4.  企业如何创建数据库

        1.  根据开发的程序确定字符集(建议UTF8)

        2.  编译的时候指定字符集

        3.  如果程序的字符集与默认数据库编译字符集不相符,那么就需要在创建数据库的时候指定字符集。

8.  显示连接删除数据库

    1.  显示数据库

        1.  show databases;  显示所有数据库

        2.  select database();  显示当前数据库

        3.  show databases like 'wang%';    模糊查询数据库

    2.  删除数据库

        1.  drop database wangyanhe;  删除数据库

    3.  连接数据库

        1.  use yangjianbo;  切换数据库

    4.  删除多余账户

        1.  drop user "root"@"::1";

            如果有删除不掉的用户,使用delete from mysql.user 语句进行删除

9.  创建用户并且授权用户

    1.  使用grant命令

        grant all on *.* to wangyanhe@"%" identified by '123';

    2.  使用create命令

        creaet user gaozhongming@"localhost" identified by '123';

        grant all on *.* to gaozhongming@"localhost";

        flush privileges;

10.  本地及远程授权访问

    1.  创建用户

       create user gaozhongming@'192.168.0.%' identified by '123';

       flush privileges;

1
2
3
4
5
[root@nfs - server  3306 ] # mysql -ugaozhongmign -p -S /data/3306/mysql.sock
Enter password:
ERROR  1045  ( 28000 ): Access denied  for  user  'gaozhongming' @ 'localhost'  (using password: YES)
 
[root@nfs - server  3306 ] # mysql -ugaozhongming -p -S /data/3306/mysql.sock -h 192.168.0.200

    2.  用户权限

        1.  收回权限

            revoke

        2.  增加权限         

            grant  

11.  Mysql主从复制

1.  什么是mysql主从复制?

   mysql主从复制是mysql自带的功能,通过逻辑的binlog日志复制到要同步的服务器本地,然后由本地的线程读取日志里面的SQL语句,重新应用到mysql数据库中。

2.  主从复制的结构

   单向复制:一主一从  一主两从  一主多从  多主一从  多主多从

   双向复制:互为主从

   链式复制:类似A-->B-->C

   环式复制:生产场景很少用

   在生产工作中,mysql主从复制都是异步的复制方式。不是严格的实时数据同步。

3.  主从复制的应用场景

   1.  从服务器作为主服务器的实时数据备份

   2.  主从服务器实现读写分离,从服务器实现负载均衡LVS。

      从服务器仅仅处理用户的select查询请求,降低用户查询响应时间。

      对于更新的数据(update,insert,delete语句),交给主服务器处理。

      结构图:

      

   3.  把多个从服务器根据业务重要性进行拆分访问

      有为外部用户提供查询服务的从服务器,

      有内部DBA用来数据备份的从服务器,

      为内部人员提供访问的日志分析及供开发人员查询的从服务器。

      结构图:

      

4.  实现mysql主从读写分离的方案

   1.  通过程序代码实现(PHP和java),生产应用场景最多。

   2.  通过开源的软件(mysql-proxy,amoeba)实现读写分离,这种方式稳定性差,生产不建议使用。

   3.  大型门户网站自己开发dbproxy。

5.  mysql主从复制原理

   1.  介绍

      mysql的主从复制是一个异步的复制过程,数据将从master复制到slave,由三个线程参与完成。其中sql线程和I/O线程在slave,另外一个I/O在master.  

      要实现mysql的主从复制,首先必须打开master的binlog记录功能,否则无法实现。因为整个复制过程就是slave从master获取binlog日志,然后在slave上以相同顺序执行获取的binlog日志中所记录的各种sql操作。

      要打开mysql的binlog记录功能,通过在mysql配置文件my.cnf中的mysqld模块增加"log-bin"参数选项来实现,具体如下:

      [mysqld]

      log-bin=/data/mysql/mysql-bin

    2.  mysql主从复制原理过程详细描述

      1)  master服务器上打开binlog记录功能。

      2)  在slave服务器执行start slave命令开启主从复制开关,开始进行主从复制。

      3)  slave的I/O线程会通过在master上已经授权的复制用户权限请求连接到master服务器,并请求从指定binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容。

      4)  master服务器接收到来自slave服务器的I/O线程的请求后,master上负责复制的I/O线程会根据slave服务器的I/O线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给slave端的I/O线程。返回的信息中除了binlog日志内容外,还有在master服务器端记录的新的binlog文件名称,以及在新的binlog中的下一个指定更新位置。

      5)  当slave服务器的I/O线程获取到master服务器上I/O线程发送的日志内容,日志文件及位置后,会将binlog日志内容依次写到slave自身的relay log,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master新binlog日志时能够告诉master服务器从新binlog日志的指定文件及位置开始请求新的binlog日志内容。

      6)  slave的sql线程会实时监测relay log中的内容,把它解析成sql语句。

    6.  mysql主从复制的配置过程

          1.  在主服务器上打开log-bin,在my.cnf配置文件的mysqld模块下。

              log-bin=/data/3306/mysql-bin 

              log-bin=/data/3307/mysql-bin(如果只是从数据库,不需要配置log-bin;如果是要做级联,需要打开log-bin)

          2.  配置主从的server-id,要不同啊。

              server-id=3306

              server-id=3307

          3.  配置好以后,要重启mysql服务。

              /data/3306/mysql restart

              /data/3307/mysql restart

          4.  检查配置参数后的结果。

              egrep "log-bin|server-id" /data/3306/my.cnf

              egrep "log-bin|server-id" /data/3307/my.cnf

          5.  登录数据库查看

              mysql -uroot -p -S /data/3306/mysql.sock

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> show variables like  'server_id' ;  查看server - id
+ - - - - - - - - - - - - - - - + - - - - - - - +
| Variable_name | Value |
+ - - - - - - - - - - - - - - - + - - - - - - - +
| server_id     |  3306   |
+ - - - - - - - - - - - - - - - + - - - - - - - +
1  row  in  set  ( 0.94  sec)
 
 
mysql> show variables like  'log_bin' ;  查看binlog是否开启
+ - - - - - - - - - - - - - - - + - - - - - - - +
| Variable_name | Value |
+ - - - - - - - - - - - - - - - + - - - - - - - +
| log_bin       | ON    |
+ - - - - - - - - - - - - - - - + - - - - - - - +
1  row  in  set  ( 0.03  sec)

          6.  在主库创建用于主从复制的帐号

              grant replication slave on *.* to 'rep'@'192.168.0.%' identified by '123';

              flush privileges;

             查看一下select user,host from mysql.user;

             show grants for 'rep'@'192.168.0.%';

          7.  实现对主数据库锁表

              flush table with read lock;

          8.  备份主数据库服务器

              mysqldump -uroot -p -S /data/3306/mysql.sock --events -A -B | gzip >/opt/mysql_bak.$(date +%F).sql.gz

              -A  备份所有的库

              -B  直接覆盖原有的库

          9.  解锁主库

              unlock tables;

              查看主库的binlog的position

              show master status;

              show master logs;

          10.  把备份的数据库导入到从服务器上。

              使用scp或者rsync命令复制到从服务器上。

               rsync  -avz mysql_bak.2018-07-05.sql.gz /data/3307/

               gzip -d mysql_bak.2018-07-05.sql.gz

          11.  在从库上的操作,修改配置文件

              server-id 一定不能跟主相同,一定是唯一的。

              如果不做级联,就不用开启binlog,因为会消耗磁盘I/O

              有两种情况需要开启binlog:

                1.  级联

                2.  从库是备份服务器

          12.  在从服务器上还原备份的数据库

                mysql -uroot -p -S /data/3307/mysql.sock <mysql_bak.2018-07-05.sql 

          13.  在从服务器上,登录mysql,执行change master    

1
2
3
4
5
6
7
CHANGE MASTER TO
MASTER_HOST = '192.168.0.200' ,
MASTER_PORT = 3306 ,
MASTER_USER = 'rep' ,
MASTER_PASSWORD = '123' ,
MASTER_LOG_FILE = 'mysql-bin.000008' ,
MASTER_LOG_POS = 406 ;

          14.  在从服务器上,也可以不登陆mysql,执行下面的命令   

1
2
3
4
5
6
7
8
9
mysql  - uroot  - - / data / 3307 / mysql.sock<<EOF
CHANGE MASTER TO
MASTER_HOST = '192.168.0.200' ,
MASTER_PORT = 3306 ,
MASTER_USER = 'rep' ,
MASTER_PASSWORD = '123' ,
MASTER_LOG_FILE = 'mysql-bin.000008' ,
MASTER_LOG_POS = 406 ;
EOF

          15.  在从服务器上,登录mysql,执行

              start slave;

              show slave status\G;

              查看最关键的3个参数 

1
2
3
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master:  0

          16.  在从服务器上,也可以不登陆mysql

              mysql -uroot -p /data/3307/mysql.sock -e "start slave;"

              mysql -uroot -p /data/3307/mysql.sock -e "show slave status\G;"

12.  生产环境快速配置mysql主从复制

      1.  配置好从库,设置好log-bin和server-id参数

      2.  无需配置主库,因为主库已经上线,log-bin和server-id已经配置好了。

      3.  在主库创建帐号,用来主从复制。

      4.  使用mysqldump -uroot -p'123456'  -S /data/3306/mysql.sock -A --events -B -x --master-data=1 | gzip >/opt/$(date +%F).sql.gz

      5.  只需要在从库上导入全备,change master的时候不需要指定binlog文件名和位置。

13.  一键批量创建从库

      1.  还原备份到从库上

      2.  写脚本执行change master

      3.  写脚本执行start slave

      4.  检查主从状态

14.  mysql主从复制三个线程状态

      1.  主库:

          show processlist \G;

1
2
3
4
5
6
7
8
9
* * * * * * * * * * * * * * * * * * * * * * * * * * *  2.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * *
      Id 4
    User: rep
    Host: nfs - server: 35652
      db: NULL
Command: Binlog Dump
    Time:  2246
   State: Master has sent  all  binlog to slave; waiting  for  binlog to be updated
    Info: NULL

      2.  从库

          show processlist \G;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
* * * * * * * * * * * * * * * * * * * * * * * * * * *  1.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * *
      Id 1
    User: system user
    Host:
      db: NULL
Command: Connect
    Time:  2277
   State: Slave has read  all  relay log; waiting  for  the slave I / O thread to update it
    Info: NULL
* * * * * * * * * * * * * * * * * * * * * * * * * * *  2.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * *
      Id 2
    User: system user
    Host:
      db: NULL
Command: Connect
    Time:  2285
   State: Waiting  for  master to send event
    Info: NULL

          show slave status \G;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
* * * * * * * * * * * * * * * * * * * * * * * * * * *  1.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * *
                Slave_IO_State: Waiting  for  master to send event
                   Master_Host:  192.168 . 0.200
                   Master_User: rep
                   Master_Port:  3306
                 Connect_Retry:  60
               Master_Log_File: mysql - bin . 000010
           Read_Master_Log_Pos:  120
                Relay_Log_File: mysqld - relay - bin . 000006
                 Relay_Log_Pos:  283
         Relay_Master_Log_File: mysql - bin . 000010
              Slave_IO_Running: Yes  从库的IO线程
             Slave_SQL_Running: Yes  从库的SQL线程
               Replicate_Do_DB:
           Replicate_Ignore_DB:
            Replicate_Do_Table:
        Replicate_Ignore_Table:
       Replicate_Wild_Do_Table:
   Replicate_Wild_Ignore_Table:
                    Last_Errno:  0
                    Last_Error:
                  Skip_Counter:  0
           Exec_Master_Log_Pos:  120
               Relay_Log_Space:  620
               Until_Condition:  None
                Until_Log_File:
                 Until_Log_Pos:  0
            Master_SSL_Allowed: No
            Master_SSL_CA_File:
            Master_SSL_CA_Path:
               Master_SSL_Cert:
             Master_SSL_Cipher:
                Master_SSL_Key:
         Seconds_Behind_Master:  0   落后主库的秒数
Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno:  0
                 Last_IO_Error:
                Last_SQL_Errno:  0
                Last_SQL_Error:
   Replicate_Ignore_Server_Ids:
              Master_Server_Id:  3306
                   Master_UUID: a027a03c - 7df9 - 11e8 - 92fc - 000c296cbf3b
              Master_Info_File:  / data / 3307 / data / master.info
                     SQL_Delay:  0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: Slave has read  all  relay log; waiting  for  the slave I / O thread to update it
            Master_Retry_Count:  86400
                   Master_Bind:
       Last_IO_Error_Timestamp:
      Last_SQL_Error_Timestamp:
                Master_SSL_Crl:
            Master_SSL_Crlpath:
            Retrieved_Gtid_Set:
             Executed_Gtid_Set:
                 Auto_Position:  0
1  row  in  set  ( 0.00  sec)

15.  mysql错误代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
MySQL常见错误代码及代码说明
 
1005 :创建表失败
1006 :创建数据库失败
1007 :数据库已存在,创建数据库失败< = = = = = = = = = = = = = = = = = 可以忽略
1008 :数据库不存在,删除数据库失败< = = = = = = = = = = = = = = = = = 可以忽略
1009 :不能删除数据库文件导致删除数据库失败
1010 :不能删除数据目录导致删除数据库失败
1011 :删除数据库文件失败
1012 :不能读取系统表中的记录
1020 :记录已被其他用户修改
1021 :硬盘剩余空间不足,请加大硬盘可用空间
1022 :关键字重复,更改记录失败
1023 :关闭时发生错误
1024 :读文件错误
1025 :更改名字时发生错误
1026 :写文件错误
1032 :记录不存在< = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 可以忽略
1036 :数据表是只读的,不能对它进行修改
1037 :系统内存不足,请重启数据库或重启服务器
1038 :用于排序的内存不足,请增大排序缓冲区
1040 :已到达数据库的最大连接数,请加大数据库可用连接数
1041 :系统内存不足
1042 :无效的主机名
1043 :无效连接
1044 :当前用户没有访问数据库的权限
1045 :不能连接数据库,用户名或密码错误
1048 :字段不能为空
1049 :数据库不存在 < = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 可以忽略
1050 :数据表已存在
1051 :数据表不存在
1054 :字段不存在
1062 :字段值重复,入库失败< = = = = = = = = = = = = = = = = = = = = = = = = = = 可以忽略
1065 :无效的SQL语句,SQL语句为空
1081 :不能建立Socket连接
1114 :数据表已满,不能容纳任何记录
1116 :打开的数据表太多
1129 :数据库出现异常,请重启数据库
1130 :连接数据库失败,没有连接数据库的权限
1133 :数据库用户不存在
1141 :当前用户无权访问数据库
1142 :当前用户无权访问数据表
1143 :当前用户无权访问数据表中的字段
1146 :数据表不存在 < = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 可以忽略
1147 :未定义用户对数据表的访问权限
1149 :SQL语句语法错误
1158 :网络错误,出现读错误,请检查网络连接状况
1159 :网络错误,读超时,请检查网络连接状况
1160 :网络错误,出现写错误,请检查网络连接状况
1161 :网络错误,写超时,请检查网络连接状况
1169 :字段值重复,更新记录失败
1177 :打开数据表失败
1180 :提交事务失败
1181 :回滚事务失败
1203 :当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库
1205 :加锁超时
1211 :当前用户没有创建用户的权限
1216 :外键约束检查失败,更新子表记录失败
1217 :外键约束检查失败,删除或修改主表记录失败
1226 :当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器
1227 :权限不足,您无权进行此操作
1235 :MySQL版本过低,不具有本功能

16.  mysql主从复制读写分离授权方案

    1.  生产授权方案1

        主:web oldboy123 10.0.0.1 3306 (select,insert,delete,update)

                            从:主库的web用户同步到从库,然后回收insert,delete,update权限。

        不收回从库权限,设置read-only参数确保从库只读。

    2.  生产授权方案2

        主:web_w oldboy123 10.0.0.1 3306 (select,insert,delete,update)

        从:web_r oldboy123 10.0.0.2 3306 (select)

        风险:web_w连接从库,设置read-only参数确保从库只读

    3.  生产授权方案3

        不同步授权库mysql

17.  忽略授权表

    1.  在/data/3306/my.cnf配置文件的mysqld模块中,添加如下信息:

binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema

注意:是在主库上添加的参数。这样就不会复制到从库,减少I/O。

18.  mysql主从复制指定库的复制

    1.  在配置文件中,添加binlog-do-db = yangjianbo,test

19.  mysql主从复制只读

    1.  在配置文件的mysqld中,添加:

        read-only

        重启mysql服务。

    2.  注意:具有SUPER权限的用户可以更新,不受read-only参数影响

          来自从服务器线程可以更新,例如创建的rep账户。

20.  mysql主从复制故障

    1.  从库已经存在的数据库,主库无法同步同名的数据库。

        查看show slave status\G;

                             Last_SQL_Error: Error 'Can't create database 'wangyanhe'; database exists' on query. Default database: 'wangyanhe'. Query: 'create database wangyanhe'

        解决方法一:

        stop slave;

        set global sql_slave_skip_counter = 1;

                            start slave;

        解决方法二:

        提前把错误号写入到my.cnf配置文件中。

        slave-skip-errors = 1032,1062,1007

    2.  mysql连接慢

        skip-name-resolve

21.  mysql从库记录binlog日志的方法

    1.  级联同步

    2.  从库作为备份服务器

    3.  启动log-bin = /data/3307/mysql-bin

        log-slave-updates

        expire_logs_days = 7 

22.  一主多从 主宕机 从切换为主 继续同步

    1.  检查所有从库

        show processlist;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> show processlist \G
* * * * * * * * * * * * * * * * * * * * * * * * * * *  1.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * *
      Id 10
    User: system user
    Host:
      db: NULL
Command: Connect
    Time:  529
   State: Waiting  for  master to send event
    Info: NULL
* * * * * * * * * * * * * * * * * * * * * * * * * * *  2.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * *
      Id 11
    User: system user
    Host:
      db: NULL
Command: Connect
    Time:  528
   State: Slave has read  all  relay log; waiting  for  the slave I / O thread to update it
    Info: NULL

    2.  检查所有从库的master.info

        看哪个更新,选择最大的bin-log和位置点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@nfs - server data] # cat master.info
23
mysql - bin . 000011
464
192.168 . 0.200
rep
123
3306
60
0
 
 
 
 
 
0
1800.000
 
0
a027a03c - 7df9 - 11e8 - 92fc - 000c296cbf3b
86400
 
 
0

    3.  确保所有relay log全部更新完毕

        在每个从库上执行stop slave io_thread;

        show processlist \G;  直到看到下面的信息

1
2
3
4
5
6
7
8
      Id 11
    User: system user
    Host:
      db: NULL
Command: Connect
    Time:  833
   State: Slave has read  all  relay log; waiting  for  the slave I / O thread to update it
    Info: NULL

    4.  登录从库

        stop slave;

        reset master

    5.  进入数据库数据目录,删除master.info relay-log.info

       检查授权表,清除read-only参数

    6.  开启bin-log,如果存在log-slave-updates read-only一定要注释掉

        /data/3307/mysql restart

    7.  如果主库没有宕机,需要去主库拉取binlog补全提升主库的从库

    8.  其他从库配置

        stop slave;    

1
2
CHANGE MASTER TO
MASTER_HOST = '192.168.0.200' ,  指向新的主库

        start slave;

        show slave status \G;

    9.  修改web前端代码的数据库连接串地址

    10.  修理损坏的主库,作为新主库的从库.

23.  从库宕机

    stop slave;

1
2
CHANGE MASTER TO
MASTER_HOST = '192.168.0.200' ,<br>start slave;

24.  双主及多主

    1.  配置my.cnf的自增长

    2.  主库与从库做个反向主从复制

25.  mysql备份与还原

    1.  mysqldump命令是mysql自带的命令.

       语法:  mysqldump -u root -p123456 数据库名 > /opt/数据库名.sql

       例子:  mysqldump -uroot -p123456 yangjianbo -S /data/3306/mysql.sock > /opt/yangjianbo.sql

    2.  mysql的还原

       语法:  mysql -uroot -p123456 数据名< /opt/数据库名.sql  前提是:必须存在数据名

       例子:  mysql -uroot -p123456 gaozhongming -S /data/3306/mysql.sock < /opt/yangjianbo.sql

    3.  备份时带有参数-B

       语法:  mysqldump -u root -p123456 yangjianbo -S /data/3306/mysql.sock -B> /opt/yangjianbo.sql  

       作用:  带有-B的参数备份,yangjianbo.sql语句中会有创建库和使用库的命令。

       例子:  mysqldump -u root -p123456 yangjianbo -S /data/3306/mysql.sock -B> /opt/yangjianbo.sql

    4.  还原时带有参数的备份文件

       语法:  mysql -uroot -p123456  -S /data/3306/mysql.sock </opt/yangjianbo.sql

    5.  mysqldump的逻辑备份工作原理

       把创建库和表,插入的数据的sql导出到一个文件中,然后还原的时候,把这些sql语句重新执行一下。

    6.  备份多个库

       mysqldump -uroot -p123456 -B yangjianbo wangyanhe -S /data/3306/mysql.sock > /opt/a.sql  多个库用空格隔开

    7.  还原多个库

       mysql -uroot -p123456 -S /data/3306/mysql.sock < /opt/a.sql

    8.  如何做分库备份

       执行备份语句备份多个库

       1.  方法一:

1
mysql  - uroot  - p123456  - / data / 3306 / mysql.sock  - "show databases;"  | grep  - Evi  "info|perfor|database"  | sed  - 's#^([a-z].*$)#mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B \1|gzip >/opt/\1.sql.gz#g' |bash

       2.  方法二:

          使用for循环,执行mysqldump命令。

          后续写出来这个脚本。

          参考视频:http://edu.51cto.com/course/808.html

1
2
3
4
5
6
[root@nfs - server bak] # cat /server/scripts/fenku.sh
#!/bin/bash
for  in  `mysql  - uroot  - p123456  - / data / 3306 / mysql.sock  - "show databases;"  | grep  - Evi  "info|perfor|database" `
do
   mysqldump  - uroot  - p123456   - / data / 3306 / mysql.sock  - B $i | gzip > / opt / bak / ${i}_bak.sql.gz
done

    9.  备份库中的某个表

          语法:mysqldump -uroot -p123456 -S /data/3306/mysql.sock 库名 表1 表2 > /opt/a.sql

          mysqldump -uroot -p12345 -S /data/3306/mysql.sock yangjianbo yang

          多个表: mysqldump -uroot -p123456 -S /data/3306/mysql.sock yangjianbo yang zhang >/opt/bak/yangjianb_yang.sql           

          还原测试:mysql -uroot -p123456 -S /data/3306/mysql.sock yangjianbo </opt/bak/yangjianb_yang.sql 要指定哪个库

    10.  常见参数

          -d:  备份数据表结构

            mysqldump -uroot -p123456 -S /data/3306/mysql.sock -d yangjianbo yang >/opt/a.sql

1
2
3
4
5
[root@nfs - server opt] # grep -Ev '^/|^-|^$' a.sql
DROP TABLE IF EXISTS `yang`;
CREATE TABLE `yang` (
   ` id int ( 11 ) DEFAULT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8;

          -t:  只备份表数据

            mysqldump -uroot -p123456 -S /data/3306/mysql.sock -t yangjianbo yang >/opt/b.sql

1
2
3
4
[root@nfs - server opt] # grep -Ev '^/|^-|^$' b.sql
LOCK TABLES `yang` WRITE;
INSERT INTO `yang` VALUES ( 1 );
UNLOCK TABLES;      

          -F:  刷新binlog

             mysqldump -uroot -p123456 -S /data/3306/mysql.sock -A -B -F >/opt/all.sql

          --master-data:   自动找到binlog的位置

             mysqldump -uroot -p123456 -S /data/3306/mysql.sock --master-data=1 -A -B > /opt/all_master_data.sql

          -A:  备份所有库

          -B:  包含create database和use database的命令

          -x:   锁表

          --single-transaciton:   通过启动该选项来备份InnoDB表.

    11.  myisam引擎

          备份:mysqldump -uroot -p123456   -A  -B  --master-data=1  -x  --events   | gzip   > /opt/all.sql.gz

    12.  Innodb引擎

          备份:mysqldump -uroot -p123456 -A -B --master-data=1    --events  --single-transaction  | gzip   > /opt/all/sql.gz

    13.  source命令恢复数据库

          进入到mysql数据库中,使用source命令还原数据库。

          source /opt/bak/yangjianbo_bak.sql;  使用绝对路径

          source yangjianbo_bak.sql;  使用相对路径,就是登录mysql的那个路径

    14.  mysql恢复数据库命令

          mysql -uroot -p123456 -S /data/3306/mysql.sock yangjianbo < /opt/bak/yangjianbo_bak.sql;

    15.  mysql分库恢复数据库

          把所有的库进行解压,通过sed命令获取数据库名称。

          使用for循环把数据库还原到mysql中。    

    16.  mysql参数-e

          mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show databases;

    17.  show processlist;

          mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show full processlist;"

          mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show processlist;"

    18.  show variables;  查看数据库的参数信息

          mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show variables;" | grep log_bin                 

    19.  show global status;  查看整个数据库运行状态信息,很重要

          mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show global status;" | grep insert

    20.  show status;  查看当前会话状态信息

    21.  show full processlist;  查看正在运行的完整sql语句。重要

26.  mysqlbinlog命令

    1.  作用:解析mysql的binlog日志

    2.  binlog文件

        位置:/data/3306/mysql-bin.000001

        作用:用来记录mysql内部增删改查等对mysql数据库有更新的内容的记录,只查不改不记录。

    3.  使用mysqlbinlog查看

        mysqlbinlog mysql-bin.000016

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/ * ! 50530  SET  @@SESSION.PSEUDO_SLAVE_MODE = 1 * / ;
/ * ! 40019  SET  @@session.max_insert_delayed_threads = 0 * / ;
/ * ! 50003  SET  @OLD_COMPLETION_TYPE = @@COMPLETION_TYPE,COMPLETION_TYPE = 0 * / ;
DELIMITER  / * ! * / ;
# at 4
#180722 23:21:41 server id 3306  end_log_pos 120 CRC32 0xf4acd393       Start: binlog v 4, server v 5.6.40-log created 180722 23:21:41
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
BaFUWw / qDAAAdAAAAHgAAAABAAQANS42LjQwLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAZPT
rPQ =
' / * ! * / ;
# at 120
#180723  0:04:02 server id 3306  end_log_pos 298 CRC32 0xd34e5886       Query   thread_id=96     exec_time=0     error_code=0
SET  TIMESTAMP = 1532275442 / * ! * / ;
SET  @@session.pseudo_thread_id = 96 / * ! * / ;
SET  @@session.foreign_key_checks = 0 , @@session.sql_auto_is_null = 0 , @@session.unique_checks = 0 , @@session.autocommit = 1 / * ! * / ;
SET  @@session.sql_mode = 524288 / * ! * / ;
SET  @@session.auto_increment_increment = 1 , @@session.auto_increment_offset = 1 / * ! * / ;
/ * !\C utf8  * / / * ! * / ;
SET  @@session.character_set_client = 33 ,@@session.collation_connection = 33 ,@@session.collation_server = 33 / * ! * / ;
SET  @@session.lc_time_names = 0 / * ! * / ;
SET  @@session.collation_database = DEFAULT / * ! * / ;
CREATE DATABASE  / * ! 32312  IF NOT EXISTS * /  `yangjianbo`  / * ! 40100  DEFAULT CHARACTER  SET  utf8  * /
/ * ! * / ;
# at 298
#180723  0:04:02 server id 3306  end_log_pos 437 CRC32 0xe81222d2       Query   thread_id=96     exec_time=0     error_code=0
use `yangjianbo` / * ! * / ;
SET  TIMESTAMP = 1532275442 / * ! * / ;
DROP TABLE IF EXISTS `yang`  / *  generated by server  * /
/ * ! * / ;
# at 437
#180723  0:04:02 server id 3306  end_log_pos 609 CRC32 0xaf397ef6       Query   thread_id=96     exec_time=1     error_code=0
SET  TIMESTAMP = 1532275442 / * ! * / ;
CREATE TABLE `yang` (
   ` id int ( 11 ) DEFAULT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8
/ * ! * / ;
# at 609
#180723  0:04:03 server id 3306  end_log_pos 738 CRC32 0xaaca9d90       Query   thread_id=96     exec_time=0     error_code=0
SET  TIMESTAMP = 1532275443 / * ! * / ;
/ * ! 40000  ALTER TABLE `yang` DISABLE KEYS  * /
/ * ! * / ;
# at 738
#180723  0:04:03 server id 3306  end_log_pos 829 CRC32 0xfbedcda5       Query   thread_id=96     exec_time=0     error_code=0
SET  TIMESTAMP = 1532275443 / * ! * / ;
BEGIN
/ * ! * / ;
# at 829
#180723  0:04:03 server id 3306  end_log_pos 944 CRC32 0x48a04b08       Query   thread_id=96     exec_time=0     error_code=0
SET  TIMESTAMP = 1532275443 / * ! * / ;
INSERT INTO `yang` VALUES ( 1 )

    4.   把binlog内容导出一下。

          mysqlbinlog mysql-bin.000016 >all.sql  把所有库的所有表的修改导出

          mysqlbinlog -d yangjianbo mysql-bin.000016 >yangjianbo.sql  指定库的修改导出

          mysql -uroot -p123456  yangjianbo <yangjianbo.sql

    5.  指定开始位置和结束位置

          mysqlbinlog mysql-bin.000016 --start-position=123 --stop-position=456 -r a.sql

    6.  指定开始时间和结束时间

          mysqlbinlog mysql-bin.000016 --start-datetime='2018-07-23 0:36:50' --stop-datetime='2018-07-23 05:03:50' -r b.sql

27.  --master-data作用

    1.  --master-data=2  带注释change master to 

    2.  --master-data=1  用于主从复制                

30.  Mysql的优化

    1.  硬件优化

        1.  CPU  8-16颗CPU

        2.  内存  64位CPU 96-128G 3-4实例  32G-64G  跑2个实例

        3.  硬盘  数量越多越好  性能:ssd(高并发) > sas(普通业务,线上) > sata(线下)

        4.  raid  RAID0>RAID10>RAID5>RAID1

        5.  网卡  bond

    2.  软件优化

        1.  操作系统  64位系统

        2.  mysql  编译安装,编译优化

    3.  参数优化my.cnf

        1.  innodb_buffer_pool_size  配置到物理内存30~50%

        2.  innodb_file_io_threads

        3.  innodb_thread_concurrency

        4.  innodb_flush_log

        5.  sort_buffer_size=2M

        6.  join_buffer_size

        7.  read_buffer_size

        8.  open_files_limit=10240

        9.  skip_name_resolve(遇到问题)

        10.  监控:show global status\G

            调优工具:mysqlreport

    3.  SQL语句的优化

        1.  索引优化

            1)  抓出慢sql,配置my.cnf。

            慢查询日志分析工具  mysqlsla最好的工具

            mysqldumpslow,mysqlsla,myprofi,mysql-explain-slow-log,mysqllogfilter

        2.  大的复杂的sql语句拆分成多个小的sql语句

        3.  搜索功能

    4.  架构的优化

    5.  流程制度安全优化

31.  mysql语句

    1.  修改表字段类型

        mysql> alter table 表名 modify column 字段名 类型;

        alter table address modify column city char(30);

1.  什么是mysql主从复制?

   mysql主从复制是mysql自带的功能,通过逻辑的binlog日志复制到要同步的服务器本地,然后由本地的线程读取日志里面的SQL语句,重新应用到mysql数据库中。

2.  主从复制的结构

   单向复制:一主一从  一主两从  一主多从  多主一从  多主多从

   双向复制:互为主从

   链式复制:类似A-->B-->C

   环式复制:生产场景很少用

   在生产工作中,mysql主从复制都是异步的复制方式。不是严格的实时数据同步。

3.  主从复制的应用场景

   1.  从服务器作为主服务器的实时数据备份

   2.  主从服务器实现读写分离,从服务器实现负载均衡LVS。

      从服务器仅仅处理用户的select查询请求,降低用户查询响应时间。

      对于更新的数据(update,insert,delete语句),交给主服务器处理。

      结构图:

      

   3.  把多个从服务器根据业务重要性进行拆分访问

      有为外部用户提供查询服务的从服务器,

      有内部DBA用来数据备份的从服务器,

      为内部人员提供访问的日志分析及供开发人员查询的从服务器。

      结构图:

      

4.  实现mysql主从读写分离的方案

   1.  通过程序代码实现(PHP和java),生产应用场景最多。

   2.  通过开源的软件(mysql-proxy,amoeba)实现读写分离,这种方式稳定性差,生产不建议使用。

   3.  大型门户网站自己开发dbproxy。

5.  mysql主从复制原理

   1.  介绍

      mysql的主从复制是一个异步的复制过程,数据将从master复制到slave,由三个线程参与完成。其中sql线程和I/O线程在slave,另外一个I/O在master.  

      要实现mysql的主从复制,首先必须打开master的binlog记录功能,否则无法实现。因为整个复制过程就是slave从master获取binlog日志,然后在slave上以相同顺序执行获取的binlog日志中所记录的各种sql操作。

      要打开mysql的binlog记录功能,通过在mysql配置文件my.cnf中的mysqld模块增加"log-bin"参数选项来实现,具体如下:

      [mysqld]

      log-bin=/data/mysql/mysql-bin

    2.  mysql主从复制原理过程详细描述

      1)  master服务器上打开binlog记录功能。

      2)  在slave服务器执行start slave命令开启主从复制开关,开始进行主从复制。

      3)  slave的I/O线程会通过在master上已经授权的复制用户权限请求连接到master服务器,并请求从指定binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容。

      4)  master服务器接收到来自slave服务器的I/O线程的请求后,master上负责复制的I/O线程会根据slave服务器的I/O线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给slave端的I/O线程。返回的信息中除了binlog日志内容外,还有在master服务器端记录的新的binlog文件名称,以及在新的binlog中的下一个指定更新位置。

      5)  当slave服务器的I/O线程获取到master服务器上I/O线程发送的日志内容,日志文件及位置后,会将binlog日志内容依次写到slave自身的relay log,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master新binlog日志时能够告诉master服务器从新binlog日志的指定文件及位置开始请求新的binlog日志内容。

      6)  slave的sql线程会实时监测relay log中的内容,把它解析成sql语句。

猜你喜欢

转载自www.cnblogs.com/donghui521/p/9755530.html