mysql散记

kill pkill killall

优雅关闭数据库
1.mysqladmin
mysqladmin -uroot -pxxx shutdown
2.自带的脚步
/etc/init.d/mysql stop
3.KILL 信号的方法
kill -USR cat path/pid

登录mysql

1.mysql
2.mysql -uroot
3.mysql -uroot -p 回车 敲密码

shell 脚本加密

linux 安全技巧

清楚历史命令
history -c

history -d 2

强制linux不记录敏感历史命令
#HISTCONTROL=ignorespace

测试环境 白色
正式环境 黑色 ??

先备份 在操作
1.命令行修改登录提示符
prompt \u@june \r:\m:\s->
2.配置文件修改登录提示符
【mysql】
prompt=\u@june \r:\m\s->

5.2.2 多实例mysql登录方法
mysql -uroot -p -S /data/3306/mysql.sock

多实例的远程端口无需指定sock路径????
mysql -uroot -p -h 127.0.0.1 -P3307

5.4善用 mysql 里面的帮助命令 help

linux 的帮助 man help

help history
man history 内置

help

help show
help create
help grant

机器多是R510 CPU是E5210 48G内存 磁盘12* 300G SAS 做的RAID10
编译安装之后,做出RPM包,统一使用

多实例忘记密码
mysqld_safe --defaults-file=/data/3306/my.cnf --skip-grant-table &

mysql -u root -p -S /data/3306/mysql.sock

UPDATE mysql.user SET password=PASSWORD(“123456”) where user=‘root’;

mysql 安装完默认root 密码为空

562 为管理员root 设置密码 方法
mysqladmin -u root password “xxxxx” 没有密码的用户设置密码命令

mysqladmin -u root password ‘oldboy’ -S /data/3306/mysql.sock <== 适合多实例方式 改密码?????

563 修改管理员root 密码法一 :命令行外修改方法

mysqladmin -u root -p 旧密码 password 新密码

mysqladmin -u root -p 旧密码 password 新密码 -S /data/3306/mysql.sock <== 适合多实例

564 修改管理员密码法二 sql语句修改法

UPDATE mysql.user SET password=PASSWORD(“xxxx”) where user=‘root’;

#flush privileges 刷新到数据文件里面

提示:此方法适合密码丢失后通过 --skip-grant-tables 参数启动数据库后修改密码

565 修改管理员密码方法三
set password=password(“xxxx”)

不适合密码丢了找回来

什么时候修改密码都需要刷新 flush privileges;

推荐外面修改 里面修改 不加where 则里面的密码都改了

571 启动修改丢失的MYSQL单实例 root 密码方法

1.首先停止mysql
/etc/init.d/mysqld stop
2.使用 --skip-grant-tables 启动mysql,忽略授权登录验证
mysql_safe --skip-grant-tables --user=mysql &
mysql -u root -p <==登录时空密码

–skip-grant-tables 启动时加 表示忽略授权表验证

ps -ef | grep mysql

mysql> update user set authentication_string=’’ where user=‘root’;

mysql> alter user ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘Mynewpass@123’;

kill pkill killall

优雅关闭数据库
1.mysqladmin
mysqladmin -uroot -pxxx shutdown
2.自带的脚步
/etc/init.d/mysql stop
3.KILL 信号的方法
kill -USR cat path/pid

登录mysql

1.mysql
2.mysql -uroot
3.mysql -uroot -p 回车 敲密码

shell 脚本加密

linux 安全技巧

清楚历史命令
history -c

history -d 2

强制linux不记录敏感历史命令
#HISTCONTROL=ignorespace

测试环境 白色
正式环境 黑色 ??

先备份 在操作
1.命令行修改登录提示符
prompt \u@june \r:\m:\s->
2.配置文件修改登录提示符
【mysql】
prompt=\u@june \r:\m\s->

5.2.2 多实例mysql登录方法
mysql -uroot -p -S /data/3306/mysql.sock

多实例的远程端口无需指定sock路径????
mysql -uroot -p -h 127.0.0.1 -P3307

5.4善用 mysql 里面的帮助命令 help

linux 的帮助 man help

help history
man history 内置

help

help show
help create
help grant

机器多是R510 CPU是E5210 48G内存 磁盘12* 300G SAS 做的RAID10
编译安装之后,做出RPM包,统一使用

多实例忘记密码
mysqld_safe --defaults-file=/data/3306/my.cnf --skip-grant-table &

mysql -u root -p -S /data/3306/mysql.sock

UPDATE mysql.user SET password=PASSWORD(“123456”) where user=‘root’;

运维DBA
数据库语言

一 数据查询语言

DQL data query language

select user,host,password from mysql.user order by user asc; #asc 升序 desc 倒序

二 数据操作语言
DML data manipulation language insert update delete

三 事务性语言(TPL)

begin transaction commit rollback

四 数控控制语言字符集

data control language grant revoke

五 数据定义语言 (DDL)

data definition language

create drop

六 指针控制语言(CCL)
cursor control language declare cursor fetch into update where current

一般分三类

DDL 数据定义语言 create alter drop <-- 运维
DML 数据操作语言 select insert delete update <–开发
DCL 数控控制语言 grant revoke commit rollback <–运维

show create database june\G;

www.discuz.com
创建数据库指定字符集 gbk
create database june_gbk default character set gbk collate gbk_chinese_ci;
show create database june_gbk\G;

提示:字符集不一致 时数据库中文乱码的罪魁祸首

select database();查看当前连接的数据库

学会潜意识查看帮助

删除用户
drop user ‘xxx’@‘localhost’ ;

delete from mysql.user where user=‘root’ and host=‘xxx’;
flush privileges;

数据库运维管理的核心思想

1 未雨绸缪
2.亡羊补牢
3.完备的架构设计及备份
4.定期思考,并实战模拟以上策略演练

desc (describe)

主键查询适合最快的(类似学号)

help drop database
select user();
select now();
select version();
drop user ‘’@‘localhost’;
select user,host from mysql.user;

创建用户并赋权限
help grant
mysql> create user ‘june’@‘localhost’ IDENTIFIED BY ‘123456’;
grant all on . to ‘june’@‘localhost’;
mysql> show grants for june@localhost;

mysql> create user ‘june’@‘10.0.0.%’ IDENTIFIED BY ‘123456’;
10.0.0.0/255.255.255.0
mysql -ujune -p123456 -h 10.0.0.7

help revoke

ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot exe

通过flush previleges 解决

4个权限 select insert update delete

写为主库 读为从库

查看创建表过程:
show create database june\G;

添加主键
mysql> alter table stuinfo change id id int primary key auto_increment

添加自增长
mysql> alter table stuinfo change id id int(15) auto_increment;

删除自增长
mysql> alter table stuinfo change id id int(11);

删除主键
mysql> alter table stuinfo drop primary key;????

建表时添加索引
KEY index_name(name) 标志 MUL

后添加
mysql> alter table stuinfo add index index_name(name);

mysql> alter table stuinfo add index index_age(age);

删除索引
alter table stuinfo drop index index_name;

drop index index_name

创建联合索引
mysql> create index index_name_age stuinfo(name,age);

根据字段的前几个字符创建索引
mysql> create index index_dept on stuinfo(dept(8));

查看索引

mysql> show index from stuinfo;

创建唯一索引
mysql> create unique index index_age on stuinfo(age);

索引占用系统空间,更新数据库还需要维护索引数据

数10到几百行 小标无需建立索引;更新频繁 读取比较少的表要少建索引

需要在那些列上创建索引?

创建在条件列 select user,host from mysql.user WHERE HOST= 这里
建立在唯一值多的大表上

运维 查看慢查询 告知开发 再做修改

查询慢 大多是没有走索引

1.要在表的列上创建索引
2.索引会加快查询速度,但会影响更新的速度
3.索引不是越多越好,要在频繁查询的where后条件上创建索引
4.小表或唯一值极少的列 不创建索引 要在大表唯一值多创建索引

插入数据
mysql> insert into stuinfo(name,age) values(“朴树”,35);
多条插入
mysql> insert into stuinfo(name,age) values(“monkeyking”,38),(“姜子牙”,56);

数据备份
[root@desktop opt]# mysqldump -uroot -p12345678 -B lala > /opt/lala_bak.sql (逻辑备份,以sql语句形式导出)
-A 备份所有库 -B 指定库

[root@desktop opt]# grep -E -v “#|/|^$|–” lala_bak.sql

DQL 之select 知识实战讲解

select * from stuinfo;

1.insert 批量插入
mysql> insert into stuinfo(name,age) values(“monkeyking”,38),(“姜子牙”,56),(“lining”,78)
2. 不用* ,查询的列列出来

只查询两行
mysql> select * from lala limit 2;

从第二行开始,查询两行
mysql> select * from lala limit 2,2;

mysql> select * from stuinfo where id=2;

mysql> select * from stuinfo where name=“李白”; 字符串查询 要添加双引号

mysql> select id,name from stuinfo order by id desc; 降序

mysql> select id,name from stuinfo order by id asc; 升序

多表查询
创建学生表

drop tables student;
create table student(
Sno int(10) not null comment ‘学号’,
Sname varchar(16) not null COMMENT ‘姓名’,
Ssex char(2) NOT NULL COMMENT ‘性别’,
Sage tinyint(2) NOT NULL default ‘0’ COMMENT ‘学生年龄’,
Sdept varchar(16) default NULL COMMENT ‘学生所在系别’,
PRIMARY KEY (Sno),
key index_Sname (Sname)
)ENGINE=InnoDB auto_increment=1 default charset=utf-8;

mysql> alter table student add primary key (Sno);

mysql> alter table student add index index_Sname(Sname);

mysql> alter table student add Sdept varchar(16) not null comment ‘学生所在系’;

创建课程表

create table course(
Cno int(10) not null comment ‘课程号’,
Cname varchar(10) not null comment ‘课程名’,
Ccredit tinyint(2) not null comment ‘学分’,
primary key (Cno)
);

创建选课表
create table SC( SCid int(12) not null auto_increment comment ‘主键’,
Cno int(10) not null comment ‘课程号’,
课程号是课程表的外键,学号是学生表的外键
Sno int(10) not null comment ‘学号’,
Grade tinyint(2) not null comment ‘学生成绩’,
primary key (SCid)
);

学生表 插入数据

mysql> insert into student values (0001,‘宏志’,‘男’,30,‘计算机网络’ );
mysql> insert into student values (0002,‘李硕’,‘男’,20,‘物流管理’ );
mysql> insert into student values (0003,‘王昭君’,‘女’,25,‘画家’ );
mysql> insert into student values (0004,‘王昭君’,‘女’,25,‘诗人’ );
mysql> insert into student values (0005,‘花木兰’,‘女’,24,‘战士’ );
mysql> insert into student values (0006,‘扁鹊’,‘女’,35,‘辅助’ );

课程表 插入数据
mysql> insert into course values(1001,‘linux高级架构师’,1);
mysql> insert into course values(1002,‘linux中级架构师’,9);
mysql> insert into course values(1003,‘linuxDBA架构师’,5);
mysql> insert into course values(1004,‘linux系统架构师’,9);
mysql> insert into course values(1005,‘linux运维工程师’,4);

选课表 插入数据

insert into SC(Sno,Cno,Grade) values(0001,1001,4);
insert into SC(Sno,Cno,Grade) values(0001,1002,8);
insert into SC(Sno,Cno,Grade) values(0001,1003,7);
insert into SC(Sno,Cno,Grade) values(0001,1004,4);
insert into SC(Sno,Cno,Grade) values(0002,1001,8);
insert into SC(Sno,Cno,Grade) values(0002,1002,2);
insert into SC(Sno,Cno,Grade) values(0002,1003,3);
insert into SC(Sno,Cno,Grade) values(0002,1004,8);
insert into SC(Sno,Cno,Grade) values(0003,1001,2);
insert into SC(Sno,Cno,Grade) values(0003,1002,4);
insert into SC(Sno,Cno,Grade) values(0003,1003,5);
insert into SC(Sno,Cno,Grade) values(0003,1004,7);
insert into SC(Sno,Cno,Grade) values(0004,1003,5);
insert into SC(Sno,Cno,Grade) values(0004,1004,2);

select 表名要大小写,关键字不用大小写

联表查询 不一定要有外键

mysql> select student.Sno,student.Sname,course.Cname,SC.Grade from student,course,SC where student.Sno=SC.Sno and course.Cno=SC.Cno;

mysql> select student.Sno,student.Sname,course.Cname,SC.Grade from student,course,SC where student.Sno=SC.Sno and course.Cno=SC.Cno order by Grade desc;

使用explain 查看使用索引

mysql> explain select * from test where name=“lisi”\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test
type: ref
possible_keys: index_name
key: index_name
key_len: 50
ref: const
rows: 1
Extra: Using where; Using index
1 row in set (0.00 sec)

mysql> explain select * from test where id=1\G;

使用update 更新行内容
mysql> update test set name=“周迅” where id=2;

update 修改整列
mysql> select * from test order by id asc;

使用mysqldump 备份文件
[root@desktop opt]# mysqldump -uroot -p12345678 > /opt/test_bak.sql

使用mysql 恢复文件
[root@desktop opt]# mysql -uroot -p12345678 lala < /opt/test_bak.sql

查看mysql binlog日志
[root@desktop mysql]# mysqlbinlog /var/lib/mysql/binlog.000020

利用binlog 日志 恢复数据

误操作数据恢复
1.看看是否可以停库 不让继续写入
2.切割日志 先备份

mysqladmin -uroot -p12345678 flush-log

mysql日志 (直接mysqlbinlog出来的 文件
执行sql部分的sql显示为base64编码格式)

[root@desktop mysql]# mysqlbinlog mysqlbin_lala.000002 --base64-output=decode-rows -v
/opt/MySQL/bin/mysqlbinlog --base64-output=decode-rows -v --start-date=‘2014-09-16 14:00:00’ --stop-date=‘2014-09-16 14:20:00’ /opt/mysql/log/mysql-bin.000017 >/opt/mysql_bak/mysqlbinlogsql_restore_2014091614.sql

终端命令行查询表 加 -e “sql 语句”
[root@desktop mysql]# mysql -uroot -p12345678 -e “select * from lala.test;”

3.备份后 干掉操作失误语句

将备份好的001恢复到库,再将0002恢复到库 速度要快

binlog 只记录 更改 不记录查询

iptables network nfs mysqld httpd 系统启动服务顺序

Hbase nosql 数据库
ActiveMQ 异步存储
HDFS
kafka
zookeeper 分布式
redis 异步存储??

cat test.sh
user=‘whoami’

sh test.sh && echo $user 返回结果是???? 空 (如果用.d 或者source 调用 结果就是用户名)
[root@ecs-confi001 ~]# sh a.sh && echo $user

[root@ecs-confi001 ~]# source a.sh && echo $user
root

???????

防止误操作

update 操作

-U

alias mysql=‘mysql -U’ update 安全模式

根据条件删除行数据
delete from test where id>3;

truncate table test; 直接清空

truncate 与 delete 区别

增删改表字段
alter table add
mysql> alter table test add age int(4) after name;
mysql> alter table test add qq varchar(10) first;
mysql> alter table test001 drop sex;

出现乱码 多是字符集出问题

第一种方法
登录mysql后
语句前加 set name latinl 或其他
set names latinl 临时 退出后失效
source /root/mysql.sh

DQL DML 语句之前 set names 系统及库的字符集

库里面查询文件方法
第二种 在sql文件中指定set names latinl;然后登陆mysql 通过 source执行sql.sh
mysql> system ls /root/mysql.sh
mysql> source mysql.sh

第三种 在sql文件中指定 set names latinl ;然后通过mysql 命令导入数据
通过导入 数据解决乱码

mysql -uroot -p’xxxx’ lala < /mysql.sh
mysql -uroot -p’xxx’ -e “set names latinl ;select * from test001;”

第四种 通过指定mysql命令的字符集参数实现 --default-character-set=latinl

mysql -uroot -p’xxx’ --default-character-set=latinl lala < /home/test.sql

第五种

在客户端指定latinl字符集
在服务端指定latinl字符集
不乱码的思想: 程序 linux 客户端(mysql) 服务端(mysql) 库(mysql) 表(mysql) 统一

不乱码的思想 中英文混合建议 utf-8

mysql> show character set;

更改my.cnf 的参数 (永久更改)

character-set-server=utf8 适合5.5

库表 程序

create database lala default character set utf8 collate uft8_general_ci;(default character set utf8 collate 大写????)

建表 default charset=utf8

查看变量
mysql> show variables;

查看状态
mysql> show global status;

show variables like ‘key_buffers%’

set global key_buffer_size=

mysql mysqldump mysqlbinlog mysqladmin

mysql 字符集介绍

character(字符集) collation (校对规则)

mysql 如何选择字符集
1.如果处理各种各样的文字,发布到不同的国家地区,应选择unicode 字符集,对mysql来说就是utf-8(每个汉字三个字节),如果应用
要处理英文,仅有少量汉字 UTF-8 更好
2.如果需要支持中文,并且数据量很大,性能要求也很高,可选GBK (定长,每个汉字双字节,英文也占双字节),如果需要大量运算,比较排序
定长字符集,更快,性能高
3.处理移动互联业务,可能需要utf8mb4字符集

character_set_client
character_set_connection
character_set_results 这三个默认客户端字符集

locale 查看目前系统字符集

/etc/sysconfig/i18n

LANG=en_US.UTF-8

source /etc/sysconfig/i18n

. /etc/sysconfig/i18n

mysql> show variables like ‘character_set%’;

--------------------------±-------------------------------+
| Variable_name | Value |
±-------------------------±-------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
±-------------------------±-------------------------------+
8 rows in set (0.00 sec)

mysql> quit
Bye

服务端 修改database 和server

不乱码的思想
1.linux 系统服务端

cat /etc/sysconfig/i18n
LANG=“zh_CN.UTF-8”

./etc/sysconfig/i18n
echo $LANG

提示:linux 客户端也要修改相应的字符集

2.mysql数据库的客户端字符集

临时更改生效
法一:
mysql -uroot -p
set names utf8

法二:

mysql -u root -p --default-character-set=utf8

永久生效:
更改my.cnf 客户端模块的参数 可以实现set names utf8 的效果 并且永久生效

[client]
default-character-set=latin1

提示: 无需重启服务 退出重新登录就生效,相当于 set names latinl

3.mysql 服务端

2)更改my.cnf参数

[mysqld]
default-character-set=utf8 适合5.1及以前
character-set-server=utf8 适合5.5

4 myslq库表

建库建表 指定字符集

在登录数据库时,我们用mysql --default-character-set=字符集-u root -p 进行连接,这时我们
再用show variables like ‘%char%’;命令查看字符集设置情况,可以发现客户端、数据库连接、
查询结果的字符集已经设置成登录时选择的字符集了 ???

找到原因了

gbk utf8

mysql> select @@binlog_format

mysql> system mysqlbinlog mysql-bin.000014

如何更改生产mysql数据库表的字符集

更改数据库表的字符集

对于已有的数据库想修改字符集不能直接通过"alter database character set *"
或 “alter table tablename character set *”这两个命令都没有跟新已有记录的字符集 而只是对新创建的
表或者记录生效

已有记录的字符的调整,必须先将数据导出,经过修改字符集后导入才完成

修改数据库默认编码
alter database [you db name] charset [your character setting]

模拟将latin1 字符集的数据库修改为GBK 字符集的实际过程

1.导出表结构

mysqldump -uroot -p --default-character-set=latinl -d database > altable.sql

–default-character-set=gbk 表示以GBK字符集进行连接 -d 只导表结构

2.编辑altable.sql 将latinl 改为gbk

3.确保数据库不再更新 导出所有数据

mysqldump -uroot -p --quik --no-create-info --extend-insert --default-character-set=latinl
dbname > alldata.sql

参数说明:

–qiuk :用于转储大的表 强制mysqldump 从服务器一次一行的检索数据而不是检索所有行,并输出cache 到内存中

–no-create-info : 不创建create table 语句
–extended-insert 使用包括几个values 列表的多行insert 语法,这样文件更小,io也小,导入数据会非常快,
–default-character-set=latinl 按照原有字符集导出数据,这样导出的数据中,所有的中文都是可见的,不会保存成乱码。

4.打开alldata.sql 将set names latinl 修改成 set names gbk(或者修改系统的服务端和客户端)

5.建库

create database dbname default charset gbk;

6.创建表 执行altable.sql

mysql -uroot -p dbname < alltable.sql

7.导入数据

mysql -uroot -p dbname < alldata.sql

总结:latinl–》utf8

1.建库及表的语句导出,sed批量修改为utf8

2.导出所有数据

3.修改mysql 的系统端和服务端的编码为utf8

4.删除原有的库表及数据

5.导入新的建库建表的语句

6.导入mysql的数据

运维做什么?

1.保护公司的数据 2.保证客户网站7*24提供服务

相对来讲 根据业务环境来判断

mysqldump备份数据库

[root@desktop ~]# mysqldump -uroot -p lala > /etc/opt/mysql_bak0824.sql

[root@desktop opt]# egrep -v “#|/|^$|–” /etc/opt/mysql_bak0824.sql
SET NAMES utf8mb4 ;
DROP TABLE IF EXISTS test001; # 如果有先删除
SET character_set_client = utf8mb4 ;
CREATE TABLE test001 (
id int(10) NOT NULL AUTO_INCREMENT,
name varchar(16) NOT NULL,
addr varchar(30) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
LOCK TABLES test001 WRITE; #写锁
INSERT INTO test001 VALUES (1,‘wangfei’,‘xian’),(2,‘liqingzhao’,‘xian’),(3,‘fanbingbing’,‘xian’),(4,‘limi’,‘xian’),(5,‘songminglu’,‘xian’),(6,‘shenglina’,‘beijing’),(7,‘wangweiming’,‘zhengzhou’),(8,‘liuwenting’,‘weinan’),(9,‘wangzhaojun’,‘shanghai’);
UNLOCK TABLES;

乱码情况下 指定字符集导出

删除id=9的行
mysql> delete from test001 where id=9;

恢复备份的数据(指定库)
[root@desktop opt]# mysql -uroot -p lala < /etc/opt/mysql_bak0824.sql

[root@desktop ~]# mysqldump -uroot -p -B lala > /etc/opt/mysql_bak0824_B.sql (备份文件多了一个创建库和use库的语句)

binlog 日志 备份

范例四 优化备份文件大小,减少输出注释(debug测试)

利用mysqldump 的–compact 参数优化下备份结果
[root@desktop opt]# mysqldump -uroot -p --compact -B lala > /etc/opt/mysql_bak0824_B_compact.sql

指定压缩命令

[root@desktop opt]# mysqldump -uroot -p -B lala|gzip > /etc/opt/mysql_bak0824_B.sql.gz

对比备份结果大小

[root@desktop opt]# ll -h
总用量 16K
-rw-r–r-- 1 root root 781 8月 24 13:27 mysql_bak0824_B_compact.sql
-rw-r–r-- 1 root root 2.3K 8月 24 13:07 mysql_bak0824_B.sql
-rw-r–r-- 1 root root 901 8月 24 13:30 mysql_bak0824_B.sql.gz
-rw-r–r-- 1 root root 2.1K 8月 24 12:13 mysql_bak0824.sql

1.导出数据用-B 参数

2.用gzip 对备份文件压缩

备份多个库及多个参数练习

mysql> create table tiger( id int(6) not null auto_increment, name char(12) not null, note varchar(30) , primary key(id) );

mysql> system mysqldump --help > /etc/opt/mysqldumpnote.txt

mysql -uroot -p -e “show databases;”|grep -Evi “databse|info|perfor” Evi

[root@desktop opt]# mysql -uroot -p -e “show databases;”|grep -Evi “databse|info|perfor”|sed ‘s#^#mysqldump -uroot -p -B #g’

[root@desktop opt]# mysql -uroot -p -e “show databases;”|grep -Evi “databse|info|perfor”|sed -r ‘s#^([a-z].*$)#mysqldump -uroot -p -B \1 |gzip > /etc/opt/\1.sql #g’

方法一 :
[root@desktop opt]# mysql -uroot -p -e “show databases;”|grep -Evi “databse|info|perfor”|sed -r ‘s#^([a-z].*$)#mysqldump -uroot -p -B \1 |gzip > /etc/opt/\1.sql #g’|bash

方法二:

for dbname in

mysql -uroot -p -e "show databases;"|grep -Evi "databse|info|perfor"

do
mysqldump -uroot -p --events -B d b n a m e ∣ g z i p > / e t c / o p t / dbname|gzip > /etc/opt/ dbnamegzip>/etc/opt/{dbname}.sql.gz

done

分库分表的意义?

备份单表

[root@desktop opt]# mysqldump -uroot -p --compact lala #库 test001 # 表1 test002 #表2 。。。。。 > 备份文件名

分库备份的意义是什么 ?

有时一个企业的数据库里面有多个库,例如(www,bbs,cms),但是出问题时可能是某一个库,如果在备份时候把所有的库备份成一个数据文件的话,恢复数据就比较麻烦。

分库分表的缺点:文件多,碎

1,备份一个完整全备,再做一个分库分表的备份

2,脚本批量服务多个SQL文件

3,数据量太大不合适以上方法

#以下是完整的分库,分表的备份脚本和思路

分库:

1)编程思想

mysqldump -uroot -p db1 >db1.sql
mysqldump -uroot -p db2 >db2.sql

2)拿到库名,列表

mysql -uroot -p123456 -e “show databases”|
grep -Evi “database|information_schema|performance_schema” |
sed -r ‘s#^([a-z].*$)#mysqldump -uroot -p123456 --events -B \1 |
gzip >/root/back/\1.sql.gz#g’|sh

3)循环db,dump
#!/bin/bash
#Date
#by
#Desc
MYUSER=root
MYPASSWD=123456
BACKDIR="/root/back"
MYHOST=‘127.0.0.1’
MYCMD="mysql -u M Y U S E R − p MYUSER -p MYUSERpMYPASSWD -h M Y H O S T " M Y D U M P = " m y s q l d u m p − u MYHOST" MYDUMP="mysqldump -u MYHOST"MYDUMP="mysqldumpuMYUSER -p M Y P A S S W D − h MYPASSWD -h MYPASSWDhMYHOST -x -E -B -F -R "
DBLIST=$MYCMD -e "show databases;"|grep -Evi "database|_schema|mysql"
[ ! -d $BACKDIR ] && mkdir $BACKDIR
for dbname in $DBLIST
do
$MYDUMP $dbname|gzip > B A C K D I R / BACKDIR/ BACKDIR/{dbname}_$(date +%F).sql.gz
done

分表:
#!/bin/bash
#Date
#by
#Desc
MYUSER=root
MYPASSWD=123456
BACKDIR="/root/back"
MYHOST=‘127.0.0.1’
MYCMD="mysql -u M Y U S E R − p MYUSER -p MYUSERpMYPASSWD -h M Y H O S T " M Y D U M P = " m y s q l d u m p − u MYHOST" MYDUMP="mysqldump -u MYHOST"MYDUMP="mysqldumpuMYUSER -p M Y P A S S W D − h MYPASSWD -h MYPASSWDhMYHOST -x "
DBLIST=$MYCMD -e "show databases;"|grep -Evi "database|_schema|mysql"
[ ! -d $BACKDIR ] && mkdir $BACKDIR
for dbname in D B L I S T d o T L I S T = ‘ DBLIST do TLIST=` DBLISTdoTLIST=MYCMD -e “show tables from $dbname;” |sed 1d`
for tname in $TLIST
do
mkdir -p B A C K D I R / BACKDIR/ BACKDIR/dbname
$MYDUMP $dbname $tname|gzip > B A C K D I R / BACKDIR/ BACKDIR/{dbname}/KaTeX parse error: Expected group after '_' at position 9: {dbname}_̲{tname}_$(date +%F).sql.gz
done
done

-t 表结构 -A -B -F #切割binglog (全量 增量?)

–master-data=1 --master-data=2

mysqldump的–master-data参数
mysqldump导出数据时,当这个参数的值为1的时候,mysqldump出来的文件就会包括CHANGE MASTER TO这个语句,CHANGE MASTER TO后面紧接着就是file和position的记录,在slave上导入数据时就会执行这个语句,salve就会根据指定这个文件位置从master端复制binlog。默认情况下这个值是1
当这个值是2的时候,chang master to也是会写到dump文件里面去的,但是这个语句是被注释的状态。

[root@localhost tmp]# mysqldump -uroot -p --hex-blob --lock-all-tables -R --triggers --databases mydb mydb2 --master-data=2 --default-character-set=‘utf8’ --quick>/tmp/a.sql

[root@localhost tmp]# grep -i “CHANGE MASTER TO” /tmp/a.sql

– CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000017’, MASTER_LOG_POS=2341;

[root@localhost tmp]# mysqldump -uroot -p --hex-blob --lock-all-tables -R --triggers --databases mydb mydb2 --master-data=1 --default-character-set=‘utf8’ --quick>/tmp/a.sql

[root@localhost tmp]# grep -i “CHANGE MASTER TO” /tmp/a.sql

CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000017’, MASTER_LOG_POS=2341;

增量恢复

mysqldump 的关键参数说明

关键参数 mysqldump --help

  1. -B 指定多个库,增加建库语句和use 语句

2.–compact 去掉注释 适合调试 生产不用

3.-A 所有库

  1. -F 刷新binlog日志

  2. –master-data 增加binlog日志文件名及对应的位置点

6.-x --lock-all-tables

  1. -l --lock-tables lock all tables for read

  2. -d 只备份表结构

  3. -t 只备份数据

  4. –single-transaction 适合innodb事务数据库备份

myisam

mysqldump -uroot -p -A -B --master-data=2 -x --events |gzip > /opt/all.sql.gz

innodb
mysqldump -uroot -p -A -B --master-data=2 --single-transaction --events |gzip > /opt/all.sql.gz

190914

mysql -uroot -p -e “show processlist” #查看链接用户数和状态相关信息

查两次还在ID 怎么办? 慢查询

explain

mysql -uroot -p -e “show full processlist”

mysql -uroot -p -e “show variables;” |grep log_bin

mysql -uroot -p -e “show status;”

mysql -uroot -p12345678 -e “show global status;” | grep select

[root@desktop mysql]# mysql -uroot -p12345678 -e “show global status;” | grep select

#状态计数器

show global status like ‘%insert%’;

[root@desktop mysql]# mysql -uroot -p12345678 -e “show global status like ‘%insert%’;” | grep insert

状态 每天查看查询 查看连接

key_buffer_size = 16K 索引缓存大小 myisam存放索引的缓冲器

mysql> set global key_buffer_size=1024102432;

不重启生效!!

先在全局里面改,再配置文件改 重启不重启都生效

show status #当前会话的数据库状态信息

show global status #查看整个数据库运行状态信息,很重要分析并做好监控

show processlist #查看正在执行的sql 语句,看不全

show full processlist #查看正在执行的sql语句 全

set global key_buffer_size = 327772128 #不重启数据库调整数据库参数 直接生效 重启后失效

show variables; #查看数控库的参数信息,例如:my.cnf 里参数的生效情况

开关的参数不能改 大小的可以改

mysql的binlog日志

增删改查的记录

记录所有库 所有表

mysqlbinlog -d oldboy mysql-bin.00020 > /opt #指定数据库名 拆库

vimdiff

0902 基于位置点的增量恢复

921 指定位置点和结束的位置

mysqlbinlog mysqlbinlog.0001 --start-position=510 --stop-position=1312 -r pos.sql

输出 初始位置 510 结束位置 1312 的所有binglog日志到pos.sql

注意 :结尾的日志比较特殊 不会被包含 即 输出 1312pos 以前的binlog 位置点信息一般要实际存在 不能乱指定

912 指定开始位置到文件结束
mysqlbinlog mysqlbinlog.0001 --start-position=510 -r pos510-end.sql
输出 初始位置为510 结束位置到文件结尾的所有binlog 到pos510-end。sql 当然 也可以指定库名输出binlog, 如

mysqlbinlog mysqlbinlog.0001 --start-position=510 -r pos510-end.sql -d lala

-r 和重定向一样

指定开始和结束时间恢复

mysqlbinlog

-d 截取指定库的binlog
按照位置截取
mysqlbinlog -v --base64-output=DECODE-ROWS --start-datetime=“2017-08-14 16:30:29” --stop-datetime=“2017-08-14 17:30:31” --database=test mysql-bin.000893 >1.sql

恢复 全备 增量

mysql

mysqladmin

mysqldump

mysqlbinlog

引子 普通文件的数据同步

rcync sersync inotify scp nfs samba svn

  1. nfs 网络文件共享可以同步存储数据 挂载

  2. samba 共享数据

  3. 定时任务或守护进程结合rsync scp

  4. inotify(sersync) +rsync 触发式实时数据同步

5.ftp 数据同步

6.ssh key+scp/rsync

  1. svn版本管理

8.rsynnc sersync inotify union (双向同步) csync2(多向同步)

mysql 的主从同步方案和上述的 2,3点是类似的,只不过mysql无需第三方工具,而是其自带的同步复制功能,另外一点 mysql 的主从同步并不是磁盘

上文件直接同步。replication

总结企业linux运维场景数据同步方案

1.文件级别同步方案
scp nfs sftp http samba rsync csync2 union

思想:
1.文件级别也可以利用mysql MongoDB 等软件
2.两个服务器同事写数据,双写就是一个同步机制

2.文件系统级别同步

drdb (基于文件系统同步网络raid1),同步几乎任何业务数据。
mysql 数据库的官方推荐drbd同步数据,所有单点服务例如 : nfs mfs(drbd)

3.数据库同步方案

a. 自身同步机制

mysql replication ,mysql 主从复制 (逻辑的SQL从写)
oracle dataguard (物理的磁盘,逻辑的SQL语句从写)

b.第三方drdb

1000服务器 3000实例

大多数的数据库的主从同步是异步方式

1.3mysql 主从复制的应用场景
mysql 主从复制有利于数据库架构的健壮性,提升访问速度和易于维护管理

1)主从服务器互为备份

非人为的硬件,访问故障,对于人为的执行 drop delete 无能为力

2)主从服务器读写分离分担网站压力

主从服务器架构可通过程序(php java) 或代理 (mysql-proxy amoeba ) 对用户的请求 实现读写分离

1.binlog 1台从库什么不干 只负责同步 2.双写 (压力大 ) 3. 程序写一个 1分钟log 4.异步同步换成实时同步 5.drbd abc等级

如果网站是以非更新(以浏览为主)的业务,例如 blog www 首页展示等业务 查询请求比较多 这是从服务器的读写分离负载均衡就很有效了,这就是传说中的
读写分离数据库结构

中大型公司 :通过程序(php java)
测试环境 :代理软件(mysql-proxy amoeba)
门户网站: 分布式dbproxy (读写分离 hash负载均衡 健康检查)

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