zoukankan      html  css  js  c++  java
  • mysql 数据库的主从复制及备份、恢复

    ##远程登录MySql
    
    mysql -h62.234.124.229 -P31306 -ucrab -p123456
    
    mysql --host=62.234.124.229 --user=yq --password=123456
    
    ##给远程登录的用户授权:
    grant all on *.* to crab@'114.248.166.196' identified by '123456';
    grant select,update,delete on *.* to crab@'114.248.166.196' identified by '123456';
    
    crab@'114.248.166.196':权限一定是用户名+ip地址;
    crab@'114.248.166.%'
    crab@'114.248.%'
    crab@'%'   表示全部地址均可访问;
    
    ##测试远程连接是否可用
    telnet ip 数据库端口   --3306 是mysql的默认端口,如果连接数据库时不指定端口,默认尝试去连3306 
    
    ##客户端mysql命令的参数:mysql --help
    
    -h :host
    -u : user
    -p : password 
    -e, --execute=name  Execute command and quit. (Disables --force and history
    -f, --force         Continue even if we get an SQL error. Sets
                          abort-source-on-error to 0
                          file.)
    -P, --port=#        Port number to use for connection or 0 for default to, in
                          order of preference, my.cnf, $MYSQL_TCP_PORT,
                          /etc/services, built-in default (3306).
    -s, --silent        Be more silent. Print results with a tab as separator,
                          each row on new line.
    
    -E, --vertical      Print the output of a query (rows) vertically.
    -D, --database=name Database to use.
    
                         
    ##远程执行 指令:                      
        mysql --host=62.234.124.229 --user=yq --password=123456 --execute="show grants"
        mysql -h62.234.124.229 -uyq -p123456 -e"show grants"
        mysql -h62.234.124.229 -ucrab -p123456 -e "select * from city order by Population desc limit 10;"
    
    
    ## mysqladmin指令:
        flush-hosts:刷新客户端错误连接的缓存
        processlist与登录mysql后命令行执行 show processlist;一样的
        mysqladmin -c5 -i2 -h 62.234.124.229 -ucrab -p123456 processlist
        mysqladmin -c5 -i2 -h 62.234.124.229 -ucrab -p123456 status
    -c:是一共执行多少次
    -i:是间隔几秒,
    
    
    ##查看客户端连接ID:select connection_ID();
    
    
    ##binlog与mysqlbinlog命令
        binlog是mysql的二进制日志,记录mysql中所有的数据和结构**变化**
    
        1.打开二进制日志,参数 log_bin,在my.cnf里添加该参数
    
        show global variables like "log_bin"  
        
        | log_bin                                 | ON                                      |
        | log_bin_basename                        | /var/lib/mysql/VM_0_15_centos-bin       |
        | log_bin_index                           | /var/lib/mysql/VM_0_15_centos-bin.index |
    
        VM_0_15_centos-bin.index,以index结尾的文件存放的是当前binlog列表名
    
        mysqlbinlog 是用来打开读取二进制日志的
        mysqlbinlog VM_0_15_centos-bin.index
    
        show global variables like "%log_bin%"
    
    ##mysql命令行,远程查看binlog日志:
        show binary logs;
        show binlog events in "VM_0_15_centos-bin.000003"
      show master status 查看当前正在写入的binlog 及其position
      show master logs 查看所有的Binlog
      flush logs 重新生成新的 binlog文件,但是可能删除之前的binlog文件,再确认
    ##临时整理: mysqlbinlog --start-position=471 --stop-position=875 --database=ops /var/lib/mysql/mysql-bin.000003 从binlog日志恢复数据 恢复命令的语法格式: mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名 常用参数选项解释: -–start-position=875 起始pos点 -–stop-position=954 结束pos点 -–start-datetime="2019-12-23 18:00:00" 起始时间点 -–stop-datetime="2019-12-23 19:00:00" 结束时间点 -–database=zyyshop 指定只恢复zyyshop数据库(一台主机上往往有多个数据库,只限本地log日志) 不常用选项: -u --user=name 连接到远程主机的用户名 -p --password[=name] 连接到远程主机的密码 -h --host=name 从远程主机上获取binlog日志 –read-from-remote-server 从某个MySQL服务器上读取binlog日志 mysqlbinlog -h18.6.3.72 -P31306 -ulps -p0000abc! -–start-datetime="2019-12-23 18:00:00" -–stop-datetime="2019-12-23 19:00:00" --database=g3_lps_core_00 /data/binlog/bin.000520 mysql -h18.6.3.72 -P31306 -ulps -p0000abc! --start-datetime="2019-12-23 18:00:00" ##MySQL的备份恢复 逻辑备份:按照mysql的逻辑进行备份,备份出来的是可执行的sql语句 常用命令,mysqldump(mysql自带的),mydumper(开源工具) 基于语句级别的:select ... into outfile 'xxx' mysqldump 可本机执行,也可远程执行 mysqldump Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all-databases [OPTIONS] #备份所有库: mysqldump -uroot -p123456 --all-databases >all_dump.sql 1.备份库表结构,转译成可执行的建库建表语句 2.备份完表结构后开始备份表的数据,转移成insert语句 #备份单库 mysqldump -uroot -p123456 world >world_dump.sql 恢复单库流程1: mysql -uroot -p123456 dump_test<dump_test.sql #备份多个库 mysqldump -uroot -p123456 --databases dump_test dump_test1 >test12_dump.sql 恢复方式2:登录mysql命令行,执行source +sql文件 system 是直接调用linux命令 #备份单个库的多张表: mysqldump -uroot -p123456 world table1 table2 table3 >world_dump.sql ##sql命令行执行系统指令加system :system ls -l ##mysqldump 远程备份: 在只有select权限时,通过添加--skip-lock-tables(用户没有锁表权限,只有select权限),也可以做备份 mysqldump -h62.234.124.229 -udump_user --skip-lock-tables -p123456 dump_test >dump_test.sql 备份g3_lps_meta库的game_group表:--column-statistics=0 mysql8.0版本新加的参数,其他版本不需要 mysqldump --column-statistics=0 -h18.6.3.72 -P31306 -ulps -p0000abc! g3_lps_meta game_group >world_dump.sql ##只备份结构 -d 可以用来构建空的测试环境。 mysqldump -h62.234.124.229 -udump_user -d --all-databases >all_struct.sql ##sql语句方式备份数据(注意备份路径有参数限制) select ... into outfile 'xxx' | secure_file_priv | /var/lib/mysql-files/ | 这个参数要求outfile 后面的文件必须在这个目录才可以 select * from dump_t1 into outfile '/var/lib/mysql-files/ss.txt'; load data infile '/var/lib/mysql-files/ss.txt' into table dump_test.dump_t1 ; ##创建一个新表,做数据备份 create table tb_bk as select * from tb; ##创建一个新表,基于后面的sql查询结果 create table citytop10 as select Name,Population from city order by Population desc limit 10; create table city_bak as select * from city ; 1.两个表的数据一定一致 2.结构,字段类型长度都一致,新表是没有索引的。一定要注意 3.恢复可以用rename操作,但要注意结构变化,比如索引 rename table city_bak to city; ##总结 1.mysqldump 2.select into outfile(注意文件存放目录权限) 3.create table tb_bak as select ##mysqldump操作注意点: 1.默认mysqldump备份只需要select权限和lock-tables权限 2.默认mysqldump备份是会锁表的,尽量避免线上环境直接备份 3.恢复,恢复会有drop表的操作,或其他覆盖性操作,所以恢复前一定check ##物理备份:是基于linux系统直接拷贝物理文件的备份, 分冷备(cp数据目录)与热备(xtrabackup) 冷备:把服务停下来,直接备份数据目录 show global variables like "%datadir%" | datadir | /var/lib/mysql/ | #停掉mysql服务,直接拷贝数据目录,也就是datadir cp -r mysql mysql_bak #恢复就是把原来目录删除,用备份目录替换 为什么要停mysql? innodb引擎下,有大量的数据是在内存中的,并没有落地磁盘, 所以必须先停服让内存数据落盘再拷贝。 ############MySQL的集群架构 1.主从复制 初始化mysql的数据目录(注意备份):mysql_install_db --datadir=/var/lib/mysql --user=mysql 62.234.124.229192.144.217.2352.打开binlog,配置server-id 229主:binlog=on,server-id=12 235从:binlog=on,server-id=10 需要保证server-id不能相同 3.配置权限账号 在229主配置 replication slave replication client grant replication slave,replication client on *.* to slave_user@'62.234.124.229' identified by '123456'; 4.找binlog同步位置 在229主上找到当前binlog位置 show master status; +---------------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------------------+----------+--------------+------------------+-------------------+ | VM_0_15_centos-bin.000001 | 500 | | | | +---------------------------+----------+--------------+------------------+-------------------+ ##建立同步 在235从 change master to master_host='62.234.124.229', master_user='slave_user', master_password='123456', master_log_file='VM_0_15_centos-bin.000001', master_log_pos=500; 5.启动同步,查看同步状态 start slave; show slave status; Slave_IO_Running: Yes Slave_SQL_Running: Yes 只要这两个线程是yes的,就表示正常同步中 ##主从同步的注意事项: 为了保证主从数据的一致性,从服务器上不要有变更操作 读写分离:凡是写的请求都到主,读的请求可以到从执行,配合一主多从架构,可以极大的扩展集群的承载能力 应用的读写比:10:1 读写分离需要注意一点,主从同步是可能产生延迟的,理论是1秒以内,特殊场景 可能产生几分钟甚至几小时的数据延迟。 延迟的敏感的业务,读写都在主上。 可以支持到1主20从 ###mysql 的HA,也叫高可用切换 High avilibale 1.最简单的方式是接入vip,用keepalive来做高可用 映射IP 192.144.217.100 --> 62.234.124.229 主 主服务器故障时映射IP192.144.217.100 --> 192.144.217.235192.144.217.235成为主,下一步就补充新的从 问题: 数据延迟不一致。丢失风险 引入一些新的HA策略,比如开源组件MHA ###主主复制 但是也要求只有一侧可以写入 优点:可以来回切写 主服务器执行: change master to master_host='192.144.217.235', ##从服务器的地址 master_user='slave_user', master_password='123456', master_log_file='VM_0_10_centos-bin.000002', master_log_pos=783; log_slave_update:控制从上relay执行后,是否记录到binlog 如果打开了也不会循环,server-id不同,不会自己执行自己的binlog ##mysql数据库的缓存: querycache query_cache_type | OFF 缓存:可以缓存的是sql完全一致的请求 默认是关闭的,也建议关闭;写入比较大的时候会造成系统负载 关掉cache之后,业务上引入的就是redis了,性能更好 redis理论的QPS 在10w左右; 所有数据放在内存 单线程架构,只占用一个CPU 1G内存的redis、10G内存的redis 哪一个QPS更高/每秒的查询数: 答案:一样的。 采用redis来做mysql上层的缓存,redis是如何缓存mysql数据的,哪些缓存,哪些不缓存 答案:通过业务控制 ##数据库性能测试的瓶颈 1.磁盘IO 2.内存大小 3.cpu主频 ##压测工具,基准测试;sysbench 可以做linux压测,也可以做数据库压测 ##专门的数据库TPS测试工具,tpcc-mysql
  • 相关阅读:
    [PHP] yield沟通函数循环内外
    [Linux] scp本地服务器和远程服务器拷贝文件
    [Linux] 大数据库导出大文件统计并去重
    [Go] golang连接查询mysql
    [日常] 解决mysql不允许外部访问
    [Go] golang创建目录写文件判断文件
    [日常] imap协议读取邮件
    [Go] golang使用github里的imap类库
    [Go] golang无缓冲通道实现工作池控制并发
    [Go] golang的range循环遍历通道
  • 原文地址:https://www.cnblogs.com/xiaoxiao075/p/12175285.html
Copyright © 2011-2022 走看看