1. MySQL分区
1.1. 创建带分区的表的sql语句
create table check_work_v2_suppl
(
id varchar(50) not null comment '主键id',
day_id date not null comment '被补卡日期,yyyy-MM-dd格式日期分区字段',
project_id varchar(50) null comment '项目id',
user_id varchar(50) not null comment '打卡用户id',
leader_id varchar(50) not null comment '打卡用户直属上级领导id',
clock_in_time time not null comment '上班/下班打卡时间',
clock_in_location varchar(500) not null comment '打卡地点',
clock_in_type int(2) not null comment '打卡类型:0-签到,1-签退',
attendance_type int(2) not null comment '考勤类型:0-日常考勤,1-项目考勤',
job_content text null comment '工作内容',
deliverables text null comment '交付物',
deliverables_status varchar(50) null comment '交付物状态',
approval_status int(2) default 0 not null comment '补卡流程审批状态:0-审批中,1-审批完成',
update_time timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '记录被更新时间',
create_time timestamp default CURRENT_TIMESTAMP not null comment '记录被创建时间',
version bigint default 0 not null comment '版本号',
primary key (id, day_id)
)ENGINE = InnoDB
DEFAULT CHARSET = utf8 comment '考勤补卡表:存储实际的补卡记录'
/*!50100 PARTITION BY RANGE (TO_DAYS(day_id))
(PARTITION p20200701 VALUES LESS THAN (737972) ENGINE = InnoDB,
PARTITION p20200702 VALUES LESS THAN (737973) ENGINE = InnoDB,
PARTITION p20200703 VALUES LESS THAN (737974) ENGINE = InnoDB,
PARTITION p20200704 VALUES LESS THAN (737975) ENGINE = InnoDB,
PARTITION p20200705 VALUES LESS THAN (737976) ENGINE = InnoDB,
PARTITION p20200706 VALUES LESS THAN (737977) ENGINE = InnoDB,
PARTITION p20200707 VALUES LESS THAN (737978) ENGINE = InnoDB,
PARTITION p20200708 VALUES LESS THAN (737979) ENGINE = InnoDB,
PARTITION p20200709 VALUES LESS THAN (737980) ENGINE = InnoDB,
PARTITION p20200710 VALUES LESS THAN (737981) ENGINE = InnoDB,
PARTITION p20200711 VALUES LESS THAN (737982) ENGINE = InnoDB,
PARTITION p20200712 VALUES LESS THAN (737983) ENGINE = InnoDB,
PARTITION p20200713 VALUES LESS THAN (737984) ENGINE = InnoDB,
PARTITION p20200714 VALUES LESS THAN (737985) ENGINE = InnoDB,
PARTITION p20200715 VALUES LESS THAN (737986) ENGINE = InnoDB) */
1.2. 查看见表语句
show create table check_work_v2_suppl
1.3. 单独添加分区
alter table check_work_v2 PARTITION BY RANGE (TO_DAYS(day_id)) (
PARTITION p20200701 VALUES LESS THAN (TO_DAYS('20200701')),
PARTITION p20200702 VALUES LESS THAN (TO_DAYS('20200702')),
PARTITION p20200703 VALUES LESS THAN (TO_DAYS('20200703')),
PARTITION p20200704 VALUES LESS THAN (TO_DAYS('20200704')),
PARTITION p20200705 VALUES LESS THAN (TO_DAYS('20200705')),
PARTITION p20200706 VALUES LESS THAN (TO_DAYS('20200706')),
PARTITION p20200707 VALUES LESS THAN (TO_DAYS('20200707')),
PARTITION p20200708 VALUES LESS THAN (TO_DAYS('20200708')),
PARTITION p20200709 VALUES LESS THAN (TO_DAYS('20200709')),
PARTITION p20200710 VALUES LESS THAN (TO_DAYS('20200710'))
);
alter table check_work_v2 add partition (PARTITION p20200712 VALUES LESS THAN (TO_DAYS('20200712')))
alter table check_work_v2 add partition (PARTITION p20200713 VALUES LESS THAN (TO_DAYS('20200713')))
alter table check_work_v2 add partition (PARTITION p20200714 VALUES LESS THAN (TO_DAYS('20200714')))
alter table check_work_v2 add partition (PARTITION p20200715 VALUES LESS THAN (TO_DAYS('20200715')))
1.4. 创建联合主键
alter table check_work_v2 add primary key (id,day_id);
1.5. 查询分区
select
partition_name part,
partition_expression expr,
partition_description descr,
table_rows
from information_schema.partitions where
table_schema = schema()
and table_name='check_work_v2'
order by part desc ;
1.6.定期增加分区
1.6.1.Range带TO_DAYS函数自动创建分区:
https://www.cnblogs.com/wangsongbai/p/12836438.html
1.6.2.Range不带TO_DAYS函数自动创建分区:
原文链接:
https://blog.csdn.net/m582445672/article/details/7670743
使用说明:
1.此脚本为分区后,定时自动增加分区.(被自动分区的表,一定要先手动分几个区)
2.每隔15天,定时器会执行一个存储过程,对分区日期最后的那天再往后新增15个分区.
3.Script里面Auto_partitions.sql 为存储过程
4.Script里面Timer_event.sql 为定时事件脚本
5.MySQL5.5默认并没有开启EVENT机制,需要在my.cnf文件中添加[mysqld] event_scheduler= ON
开启事件:
原文:
https://my.oschina.net/lwenhao/blog/2875029
7.增加打开文件上线.这个很重要.open_files_limit = 5000
传入参数:
databaseName为数据库名
tableName为表名
- 存储过程
DELIMITER ||
DROP PROCEDURE IF EXISTS create_Partition ||
CREATE PROCEDURE create_Partition (IN databaseName VARCHAR(50),IN tableName VARCHAR(50))
L_END:BEGIN
DECLARE MAX_PARTITION_DESCRIPTION VARCHAR(255) DEFAULT 0;
DECLARE P_NAME VARCHAR(255) DEFAULT 0;
DECLARE P_DESCRIPTION VARCHAR(255) DEFAULT 0;
DECLARE i INT DEFAULT 1;
DECLARE ISEXIST_PARTITION VARCHAR(255) DEFAULT 0;
SELECT PARTITION_NAME INTO ISEXIST_PARTITION FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = databaseName AND TABLE_NAME = tableName LIMIT 1 ;
IF ISEXIST_PARTITION <=> "" THEN
SELECT "Partition table not is exist" AS "*****ERROR*****";
LEAVE L_END;
END IF;
SELECT partition_description INTO MAX_PARTITION_DESCRIPTION FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = databaseName AND TABLE_NAME = tableName ORDER BY partition_description DESC LIMIT 1;
IF MAX_PARTITION_DESCRIPTION <=> "" THEN
SELECT "Partition table is error" AS "*****ERROR*****";
LEAVE L_END;
END IF;
SET MAX_PARTITION_DESCRIPTION = REPLACE(MAX_PARTITION_DESCRIPTION, '\'', '');
WHILE i <= 15 DO
SET P_DESCRIPTION = adddate(MAX_PARTITION_DESCRIPTION, INTERVAL i day);
SET P_NAME = REPLACE(P_DESCRIPTION, '-', '');
SET @S=CONCAT('ALTER TABLE ',tableName,' ADD PARTITION (PARTITION p',P_NAME,' VALUES LESS THAN (\'',P_DESCRIPTION,'\'))');
SELECT @S;
PREPARE stmt2 FROM @S;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt2;
SET i = i + 1 ;
END WHILE;
END L_END;||
DELIMITER ;
- 定时事件:
DELIMITER ||
CREATE EVENT auto_set_partitions
ON SCHEDULE
EVERY 15 DAY
DO
BEGIN
CALL create_Partition('database_name','table_name');
/* 如果需要向多个表分区,可以写多个 CALL 调用
CALL create_Partition('database_name','table_name');
*/
END ||
DELIMITER ;
1.7.查看事件执行情况
原文:
https://www.cnblogs.com/mincyw/archive/2011/02/22/1960983.html
https://blog.csdn.net/tcy23456/article/details/81161555?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
SELECT * FROM information_schema.EVENTS;
2. 定期备份与还原数据库
2.1.备份sql
#
# 描述:备份单个MySQL数据库的数据和结构
# 日期: 2020-07-09
# 作者:hero
#
#!/bin/bash
# 判断是否传参(数据库名)
if [ $# -eq 0 ];
then
echo "error:请指定要备份的数据库名!"
echo "e.g.:$0 mydb"
exit 1
fi
#保存备份个数,备份31天数据
number=31
#备份保存路径
backup_dir=/root/mysqlbackup
#日期
dd=`date +%Y-%m-%d-%H-%M-%S`
#备份工具
tool=mysqldump
#用户名
username=root
#密码
password=123456
#将要备份的数据库
database_name=$1
#如果文件夹不存在则创建
if [ ! -d $backup_dir ];
then
mkdir -p $backup_dir;
fi
#简单写法:
# $tool -u $username -p$password $database_name > $backup_dir/$database_name-$dd.sql
#压缩备份写法:
$tool -u $username -p$password $database_name | gzip > $backup_dir/$database_name-$dd.sql.gz
#写创建备份日志
# echo "create $backup_dir/$database_name-$dd.sql" >> $backup_dir/log.txt
#找出需要删除的备份
delfile=`ls -l -crt $backup_dir/*.sql.gz | awk '{print $9 }' | head -1`
#判断现在的备份数量是否大于$number
count=`ls -l -crt $backup_dir/*.sql.gz | awk '{print $9 }' | wc -l`
if [ $count -gt $number ]
then
#删除最早生成的备份,只保留number数量的备份
rm $delfile
#写删除文件日志
echo "delete $delfile" >> $backup_dir/log.txt
fi
1.定期备份和还原参考:
https://www.cnblogs.com/eternal1025/p/8554225.html
https://www.cnblogs.com/hellangels333/p/9059770.html
https://www.cnblogs.com/djlsunshine/p/10937403.html
2.分区和索引参考:
https://www.cnblogs.com/jianmingyuan/p/6740090.html
https://blog.csdn.net/m582445672/article/details/7670743
http://blog.chinaunix.net/uid-24086995-id-127389.html