1-16-1 LVM管理和ssm存储管理器使用&磁盘配额
大纲:
1-1- LVM逻辑卷的管理
1-2- SSM管理工具的使用
1-3- 磁盘配额技巧
======================================
问题描述:
当我们需要在一个100G的磁盘中存储120G的数据时,空间不够用,这时我们应该怎么办?
一般方法时,重新分区或者是在购买一个大点磁盘
但是,在服务器中,这是不现实的,如果该磁盘上运行着非常重要的服务呢?!
传统磁盘管理的限制,因为其不能够进行动态的磁盘管理。
这时就用到了我们的LVM逻辑卷
LVM(Logical volume Manager)是逻辑卷管理的简称。
它是Linux环境下对磁盘分区进行管理的一种机制。
现在不仅仅是Linux系统上可以使用LVM这种磁盘管理机制,
对于其它的类UNIX操作系统,以及windows操作系统都有类似与LVM这种磁盘管理软件。
LVM逻辑卷可以对磁盘的大小实现动态调整。
lvm 逻辑卷的原理:它就是通过将底层的物理硬盘进行封装,然后以逻辑卷的形式呈现给上层应用。
当我们对磁盘进行操作时,实际上不是对分区进行操作,而是通过一个叫做逻辑卷的东西对其进行底层磁盘的操作
就是通过将底层的物理硬盘封装起来,然后以逻辑卷的方式呈现给上层应用。
在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,
其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。
PE(Physical Extend),我们的LVM磁盘管理中PE的默认大小是4M大小,其实PE就是我们逻辑卷管理的最基本单位。
比如说我有一个400M的硬盘,那么在将其格式化成PV的时候,其实际就是将这块物理硬盘划分成了100个的PE,因为PE默认的大小就是4M。
PV(Physical Volume),物理卷 ,作用就是用来装PE的,普通磁盘被分割成多个PE块,最终形成PV(物理卷)
VG即卷组 作用就是用来装PV的,我们可以把一个或者多个PV加到VG当中
LV(Logical Volume),所以第三步操作就是基于VG来创建我们最终要使用的LV。
逻辑卷组成:
普通磁盘或分区,通过命令其存储空间按照PE(Physical Extand)的大小被分各种n个PE块,
注:这里的PE就相当于raid磁盘阵列中的块大小,存储基本单位,PE默认大小为4M,可调整
最后形成物理卷(PV—Physical Volume),
多个物理卷PV组成卷组(VG),最后通过卷组(VG)创建逻辑卷(LV)
1-1-2 LVM逻辑卷的管理
lvm常用的命令
功能 PV管理 VG管理 LV管理
scan 扫描 pvscan vgscan lvscan
create 创建 pvcreate vgcreate lvcreate
display显示 pvdisplay vgdisplay lvdisplay
remove 移除 pvremove vgremove lvremove
extend 扩展 vgextend lvextend
reduce减少 vgreduce lvreduce
注:PV不需要扩展和减少,当需要扩容或减少时,直接增减磁盘即可
实战:创建、并使用LVM逻辑卷
第一步:添加磁盘到虚拟机
第二步:对添加的磁盘进行分区(也可直接添加四个磁盘,组成卷组)
效果如图:
过程如下:
[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +1G
Partition 1 of type Linux and of size 1 GiB is set
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p):
Using default response p
Partition number (2-4, default 2):
First sector (2099200-41943039, default 2099200):
Using default value 2099200
Last sector, +sectors or +size{K,M,G} (2099200-41943039, default 41943039): +1G
Partition 2 of type Linux and of size 1 GiB is set
Command (m for help): n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p):
Using default response p
Partition number (3,4, default 3):
First sector (4196352-41943039, default 4196352):
Using default value 4196352
Last sector, +sectors or +size{K,M,G} (4196352-41943039, default 41943039): +1G
Partition 3 of type Linux and of size 1 GiB is set
Command (m for help): n
Partition type:
p primary (3 primary, 0 extended, 1 free)
e extended
Select (default e):
Using default response e
Selected partition 4
First sector (6293504-41943039, default 6293504):
Using default value 6293504
Last sector, +sectors or +size{K,M,G} (6293504-41943039, default 41943039):
Using default value 41943039
Partition 4 of type Extended and of size 17 GiB is set
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xa42d7e85
Device Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 83 Linux
/dev/sdb2 2099200 4196351 1048576 83 Linux
/dev/sdb3 4196352 6293503 1048576 83 Linux
/dev/sdb4 6293504 41943039 17824768 5 Extended
Command (m for help): n
All primary partitions are in use
Adding logical partition 5
First sector (6295552-41943039, default 6295552):
Using default value 6295552
Last sector, +sectors or +size{K,M,G} (6295552-41943039, default 41943039): +1G
Partition 5 of type Linux and of size 1 GiB is set
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xa42d7e85
Device Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 83 Linux
/dev/sdb2 2099200 4196351 1048576 83 Linux
/dev/sdb3 4196352 6293503 1048576 83 Linux
/dev/sdb4 6293504 41943039 17824768 5 Extended
/dev/sdb5 6295552 8392703 1048576 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# ls /dev/sdb*
/dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb4 /dev/sdb5
[root@localhost ~]#
第三步:创建PV和VG
创建PV=pvcreate 设备名称 …..
创建VG=vgcreate 卷组名称 设备成员 ..
pvcreate /dev/sdb[1-3] /dev/sdb5
pvs 和pvscan不是一个命令
创建VG
vgcreate file /dev/sdb[1-3]
vgs 查看vg卷组信息
注:vgs 和vgscan不是一个命令!
[root@localhost ~]# vgs --help
vgs: Display information about volume groups
vgs
[--aligned]
[--binary]
[-a|--all]
[--commandprofile ProfileName]
[-d|--debug]
[--foreign]
[-h|--help]
[--ignorelockingfailure]
[--ignoreskippedcluster]
[--nameprefixes]
[--noheadings]
[--nosuffix]
[-o|--options [+]Field[,Field]]
[-O|--sort [+|-]key1[,[+|-]key2[,...]]]
[-P|--partial]
[--readonly]
[--rows]
[-S|--select Selection]
[--separator Separator]
[--trustcache]
[--unbuffered]
[--units hHbBsSkKmMgGtTpPeE]
[--unquoted]
[-v|--verbose]
[--version]
[VolumeGroupName [VolumeGroupName...]]
[root@localhost ~]# vgscan --help
vgscan: Search for all volume groups
vgscan [--cache]
[--commandprofile ProfileName]
[-d|--debug]
[-h|--help]
[--ignorelockingfailure]
[--mknodes]
[-P|--partial]
[-v|--verbose]
[--version]
[root@localhost ~]#
第四步:创建LV
lvcreate -n 指定逻辑卷名称 -L 指定大小
lvcreate –n disk –L 1.5G file
lvcreate帮助信息:
[root@localhost ~]# lvcreate --help
lvcreate: Create a logical volume
lvcreate
[-A|--autobackup {y|n}]
[-a|--activate [a|e|l]{y|n}]
[--addtag Tag]
[--alloc AllocationPolicy]
[-H|--cache
[--cachemode {writeback|writethrough}]
[--cachepolicy policy]
[--cachesettings key=value]
[--cachepool CachePoolLogicalVolume{Name|Path}]
[-c|--chunksize ChunkSize]
[-C|--contiguous {y|n}]
[--commandprofile ProfileName]
[-d|--debug]
[-h|-?|--help]
[--errorwhenfull {y|n}]
[--ignoremonitoring]
[--monitor {y|n}]
[-i|--stripes Stripes [-I|--stripesize StripeSize]]
[-k|--setactivationskip {y|n}]
[-K|--ignoreactivationskip]
{-l|--extents LogicalExtentsNumber[%{VG|PVS|FREE}] |
-L|--size LogicalVolumeSize[bBsSkKmMgGtTpPeE]}
[-M|--persistent {y|n}] [-j|--major major] [--minor minor]
[--metadataprofile ProfileName]
[-m|--mirrors Mirrors [--nosync]
[{--mirrorlog {disk|core|mirrored}|--corelog}]]
[-n|--name LogicalVolumeName]
[--noudevsync]
[-p|--permission {r|rw}]
[--poolmetadatasize MetadataSize[bBsSkKmMgG]]
[--poolmetadataspare {y|n}]]
[--[raid]minrecoveryrate Rate]
[--[raid]maxrecoveryrate Rate]
[-r|--readahead {ReadAheadSectors|auto|none}]
[-R|--regionsize MirrorLogRegionSize]
[-T|--thin
[--discards {ignore|nopassdown|passdown}]
[--thinpool ThinPoolLogicalVolume{Name|Path}]
[-t|--test]
[--type VolumeType]
[-v|--verbose]
[-W|--wipesignatures {y|n}]
[-Z|--zero {y|n}]
[--version]
VolumeGroupName [PhysicalVolumePath...]
lvcreate
{ {-s|--snapshot} OriginalLogicalVolume[Path] |
[-s|--snapshot] VolumeGroupName[Path] -V|--virtualsize VirtualSize}
{-H|--cache} VolumeGroupName[Path][/OriginalLogicalVolume]
{-T|--thin} VolumeGroupName[Path][/PoolLogicalVolume]
-V|--virtualsize VirtualSize}
[-A|--autobackup {y|n}]
[--addtag Tag]
[--alloc AllocationPolicy]
[--cachepolicy Policy] [--cachesettings Key=Value]
[-c|--chunksize]
[-C|--contiguous {y|n}]
[--commandprofile ProfileName]
[-d|--debug]
[--discards {ignore|nopassdown|passdown}]
[-h|-?|--help]
[--ignoremonitoring]
[--monitor {y|n}]
[-i|--stripes Stripes [-I|--stripesize StripeSize]]
[-k|--setactivationskip {y|n}]
[-K|--ignoreactivationskip]
{-l|--extents LogicalExtentsNumber[%{VG|FREE|ORIGIN}] |
-L|--size LogicalVolumeSize[bBsSkKmMgGtTpPeE]}
[--poolmetadatasize MetadataVolumeSize[bBsSkKmMgG]]
[-M|--persistent {y|n}] [-j|--major major] [--minor minor]
[--metadataprofile ProfileName]
[-n|--name LogicalVolumeName]
[--noudevsync]
[-p|--permission {r|rw}]
[-r|--readahead ReadAheadSectors|auto|none]
[-t|--test]
[{--thinpool ThinPoolLogicalVolume[Path] |
--cachepool CachePoolLogicalVolume[Path]}]
[-v|--verbose]
[--version]
[PhysicalVolumePath...]
第六步:格式化、挂载并读写数据
mkfs.xfs /dev/file/disk
or
mkfs.xfs /dev/mapper/file-disk #格式化分区
df –h | grep /disk #检查挂载信息
lvs #lvscan查看lv卷信息
vgs #vgscan查看vg卷组信息
pvs #pvscan查看pv物理卷信息
写入数据,测试卷:
===========================================
实验:PE的大小更改
查看默认的PE大小为:4M,如图:
pvdisplay /dev/sdb1
新建一个分区/dev/sdb6
[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
All primary partitions are in use
Adding logical partition 6
First sector (8394752-41943039, default 8394752):
Using default value 8394752
Last sector, +sectors or +size{K,M,G} (8394752-41943039, default 41943039): +1G
Partition 6 of type Linux and of size 1 GiB is set
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
[root@localhost ~]# ls /dev/sdb*
/dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb4 /dev/sdb5
[root@localhost ~]# partprobe #更新分区表
Warning: Unable to open /dev/sr0 read-write (Read-only file system). /dev/sr0 has been opened read-only.
Warning: Unable to open /dev/sr0 read-write (Read-only file system). /dev/sr0 has been opened read-only.
Warning: Unable to open /dev/sr0 read-write (Read-only file system). /dev/sr0 has been opened read-only.
[root@localhost ~]# ls /dev/sdb*
/dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb4 /dev/sdb5 /dev/sdb6
[root@localhost ~]#
新建PV和VG,并设置PE大小
vgcreate vg02 /dev/sdb6 –s 1M #设置PE块大小为1M
pvdisplay /dev/sdb6 #查看PE块大小
================================
实验:LV扩容
查看vg卷组中是否还有可用空间用于扩容 vgs
对disk逻辑卷增加500M空间 lvextend
lvextend –L +500M /dev/file/disk
使用df命令查看逻辑卷大小发现,容量没有变化。这时需要使用在线更新命令。
df –h | grep /disk #查看逻辑卷大小
xfs_growfs /dev/file/disk #RHEL7中,在线更新命令
RHEL6对文件系统进行扩容
[root@xuegod61 ~]# resize2fs /dev/Vg1/LV1
注意在:RHEL7对文件系统进行扩容
xfs_growfs 设备名称
============================================
实验:VG扩容 vgextend vgname pvname
创建PV物理卷
pvcreate /dev/sdb5
将其添加到VG卷组中
vgextend file /dev/sdb5
file 要拓展的卷组名
/dev/sdb5用来拓展的PV物理卷
=========================================================
实验:LVM减少容量
使用df –h 命令查看/disk磁盘使用情况,保证减少容量时,不会报错(保证不会丢失数据)
查看LVM逻辑卷可用空间
lvs
lvreduce –L 1G /dev/file/disk #减少逻辑卷1G容量
再次使用df –h | grep /disk命令查看磁盘容量
造成文件系统不能缩小的原因
RHEL7只能对LV动态的缩减,但是XFS不支持文件系统缩减
lvm支持在线缩减,但是ext4文件系统不支持在线缩减。
支持在线缩减的文件系统:btrfs
lvm支持在线缩小,但是ext4文件系统不支持在线缩小。btrfs支持在线缩小
Btrfs 简介
一直使用 ext2/3,ext 文件系统以其卓越的稳定性成为了事实上的 Linux 标准文件系统。
近年来 ext2/3 暴露出了一些扩展性问题,于是便催生了 ext4 。
ext4 的作者 Theodore Tso 也盛赞 btrfs 并认为 btrfs 将成为下一代 Linux 标准文件系统。
btrfs 的特性:拓展性、数据一致性、和多设备管理相关
第一是扩展性 (scalability) 相关的特性,btrfs 最重要的设计目标是应对大型机器对文件系统的扩展性要求。
其整体性能而不会随着系统容量的增加而降低。
第二是数据一致性 (data integrity) 相关的特性。
第三是和多设备管理相关的特性。 Btrfs 支持创建快照 (snapshot),和克隆 (clone) 。
=========================================================
======
实验:VG减少容量
我要把/dev/sdb1 移除
所在的VG=file
必须保障咱们的物理卷是否被使用
无法缩减一个有数据存在的pv
移除没有被占用的PV物理卷即可减少VG容量
pvs #查看卷组信息,查找没有被存储数据的PV物理卷
vgreduce file /dev/sdb5 #将PV物理卷移除
=========================================================
======
实验:LV删除方法
删除步骤相对于创建步骤正好是逆向的。
而且在删除之前必须先卸载对应lvm,否则会产生错误
故删除LV的方法如下:
1、卸载要删除的LVM
umount /disk
2、删除LVM逻辑卷
lvremove /dev/file/disk
3、删除VG卷组
vgremove file
4、删除PV物理卷
pvremove /dev/sdb[1-3] /dev/sdb[5-6]
详情如下:
注:vgs、pvs、lvs和lvscan、pvscan、vgscan命令效果
==================================================
lvm快照
关于数据的备份
冷备份:卸载掉文件系统,不能读不能写
温备份:不卸载文件系统,能读取文件系统内容但是不能写
热备份:不卸载文件系统,既能读取文件系统内容又能写入
实验:LVM逻辑卷快照创建
准备一个LVM逻辑卷,并格式化挂载
[root@localhost ~]# ls /dev/sdb*
/dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb4 /dev/sdb5 /dev/sdb6
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rhel lvm2 a-- 12.00g 4.00m
[root@localhost ~]# pvcreate /dev/sdb[1-3]
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdb2" successfully created
Physical volume "/dev/sdb3" successfully created
[root@localhost ~]# vgcreate file /dev/sdb[1-3]
Volume group "file" successfully created
[root@localhost ~]# lvcreate -n disk -L 1.5G file
WARNING: xfs signature detected on /dev/file/disk at offset 0. Wipe it? [y/n]: y
Wiping xfs signature on /dev/file/disk.
Logical volume "disk" created.
[root@localhost ~]# mkfs.xfs /dev/file/disk
meta-data=/dev/file/disk isize=256 agcount=4, agsize=98304 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=393216, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost ~]# mount /dev/file/disk /disk/
[root@localhost ~]# df -h | grep /disk
/dev/mapper/file-disk 1.5G 33M 1.5G 3% /disk
[root@localhost ~]# echo "hello world! " >> /disk/a.txt
[root@localhost ~]# cat /disk/a.txt
hello world!
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
file 3 1 0 wz--n- 2.99g 1.49g
rhel 1 2 0 wz--n- 12.00g 4.00m
[root@localhost ~]# lvcreate -s -n disk_back -L 500M /dev/file/disk
Logical volume "disk_back" created.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
disk file owi-aos--- 1.50g
disk_back file swi-a-s--- 500.00m disk 0.00
root rhel -wi-ao---- 10.00g
swap rhel -wi-ao---- 2.00g
[root@localhost ~]# umount /disk/
[root@localhost ~]# mount /dev/file/disk_back /disk/
c[root@localhost ~]# cd /disk/
[root@localhost disk]# ls
a.txt
[root@localhost disk]# cat a.txt
hello world!
首先准备一个LV
因为步骤错误 你们可以直接执行这个步骤
格式化并且挂载使用
准备测试文件
针对lv2创建一个300M快照
确保卷组是否有可用的空间
lvcreate -s -n 快照名 -L 快照大小 创建快照的设备
快照其实也是一个逻辑卷
快照只能对逻辑卷LVM进行备份,并且只能对同一个卷组的逻辑卷进行备份
使用快照
快照:
直接在快照的目录做操作,对原本的目录没有任何的影响
恢复:
删除快照,重新挂载原本lv1
1-16-1 LVM管理和ssm存储管理器使用&磁盘配额的更多相关文章
- 1-18-1 LVM管理和ssm存储管理器使用&磁盘配额(一)
LVM管理和ssm存储管理器使用&磁盘配额(一) LVM逻辑卷的管理 问题:对于生产环境下的服务器来说,如果存储数据的分区磁盘空间不够了怎么办? 因为如果要把一个分区的内容都拷贝到另一个分区上 ...
- 1-18-2 LVM管理和ssm存储管理器使用&磁盘配额 (二)
LVM管理和ssm存储管理器使用&磁盘配额 (二) 内容如下: ü LVM快照 ü ssm存储管理器的使用 ü 磁盘配额 第1章 LVM快照 lvm快照:为了保持系统的一致性,我们先做 ...
- 1-16-2 LVM管理和ssm存储管理器使用&磁盘配额
ssm存储管理器使用&磁盘配额 ssm存储管理器使用 系统存储管理器的使用 系统存储管理器(又称ssm,即system-storage-manager),是RHEL7/CentOS7新增的功能 ...
- 第十五章 LVM管理和ssm存储管理器使用 随堂笔记
第十五章 LVM管理和ssm存储管理器使用 本节所讲内容: 15.1 LVM的工作原理 15.2 创建LVM的基本步骤 15.3 实战-使用SSM工具为公司的邮件服务器创建可动态扩容的存储池 LVM的 ...
- 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用
目录 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用 16.1 LVM的工作原理 16.1.1 LVM常用术语 16.1.2 LVM优点 16.2 创建LVM的基本步骤 16.2 ...
- LVM与磁盘配额
LVM与磁盘配额 目录 一.LVM概述 1.1.LVM 概述 1.2.LVM机制的基本概念 二.LVM 管理命令 2.1.主要命令 2.2.LVM命令详解 三.设置磁盘配额 3.1.磁盘配额的概述 3 ...
- 二、存储管理器--SDRAM
2.1 硬件结构 2.1.1 硬件框图 CPU 通过存储管理器来读取 SDRAM 网卡 等外部设备,CPU不管外部设备是怎么样的,只是读存储管理器中的地址 CPU从0x30000000地址读取数据. ...
- JZ2440存储管理器--SDRAM
为了cpu访问外部设备,ARM提供一个存储管理器部件,提供访问外部设备的所需的信号(对SDRAM.网卡.nor等设备进行初始化,以便存储器管理器配合CPU进行与外设数据通讯). CPU通常读写一 ...
- 解析Linux中LVM与磁盘配额
LVM 逻辑卷管理 LVM 概述 LVM 是 Linux 操作系统中对磁盘分区进行管理的一种逻辑机制,它是建立在硬盘和分区之上.文件系统之下的一个逻辑层,在建立文件系统时屏蔽了下层的磁盘分区布局,因此 ...
随机推荐
- matplotlib对LaTeX数学公式的支持
Matlplotlib对LaTeX有一定的支持,如果记得使用raw字符串语法会很自然: xlabel(r"x2y4x2y4") 在matplotlib里面,可以使用LaTex的命令 ...
- node+express+http-proxy-middleware做代理
最近,不赶着做项目,于是想着怎样做公司的前后端分离,这个时候想到了nodejs,于是打算今天做一个代理的demo,其实代码很简单,但是一直卡在一个地方,现在问题解决了,贴上代码和截图. html &l ...
- docker——容器(container)
容器相关命令一览表: docker create docker run docker start/stop/restart docker attach/exec docker rm docker ex ...
- SQL Server 数据分页查询
最近学习了一下SQL的分页查询,总结了以下几种方法. 首先建立了一个表,随意插入的一些测试数据,表结构和数据如下图: 现在假设我们要做的是每页5条数据,而现在我们要取第三页的数据.(数据太少,就每页5 ...
- Mybatis入门配置
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .20 ...
- hdu6127 Hard challenge
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6127 题目: Hard challenge Time Limit: 4000/2000 MS ...
- $Python技巧大全
知乎上有一个问题:Python 有什么奇技淫巧?其中有各种不按套路出牌的招数,也不乏一些惊为天人的"奇技淫巧",会让你大呼:居然还有这种操作??? 本文就是对日常使用过的或者觉得很 ...
- MySQL-5.7 备份与恢复
一.备份分类 按介质分类: 物理备份 指通过拷贝数据库文件方式完成备份,适用于数据库很大,数据重要且需要快速恢复的数据库. 逻辑备份 指通过备份数据库的逻辑结构和数据内容的方式完成备份,适用于数据库不 ...
- Java线程状态流转---线程
说明:线程共包括以下5种状态.1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runn ...
- 20145302张薇《Java程序设计》第八周学习总结
20145302 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章 日志API简介 使用日志的起点是Logger类,要取得Logger类,必须使用Logger的静态方法get ...