MySQL示例数据库sakila介绍
发布时间:2025-05-19 14:55:02 发布人:远客网络
一、MySQL示例数据库sakila介绍
1、sakila数据集是MySQL官方提供的学习资源,由Mike Hillyer制作。它取代了Oracle的world数据集,简化了学习流程。
2、此数据集包含了23个表,构建了一个全面的数据库环境。其中包含:
3、address表:记录客户、员工、商店的地址。
4、customer表:观看电影的用户信息。
5、film_actor表:电影与演员的关联。
6、film_category表:电影与分类的关联。
7、film_text表:电影文本信息,更新时保持同步。
8、inventory表:库存信息,表示某个电影在某个商店的状态。
9、每个表之间通过关系模型相互关联,构建了一个完整的数据库结构。读者可以深入学习这些表之间的联系,以及如何通过SQL操作这些数据。此外,还有相关阅读材料提供进一步学习。通过sakila数据集,学习者可以掌握MySQL的使用技巧,提高数据库管理能力。
二、navicat怎么设置备份数据库的路径
用户在使用 Navicat过程中,一定会遇到查找配置文件路径的操作。如果用户更换电脑,可能会涉及到原来的电脑中的数据库相关工作内容需要转移到新电脑上的 Navicat。为了帮助用户快速查找文件路径,本篇文章详细介绍了不同功能相对应的配置文件路径查找方式。
在 Navciat中,配置文件大致包括查询、导入/导出文件、备份文件、数据传输、数据同步、结构同步或批处理作业,他们的保存路径分为两个:设置位置和文件位置。
1.“查询”、“导入/导出”以及“备份”文件等是保存在对应连接的设置位置中,可以通过右击连接->编辑连接->高级->设置位置中找到对应的保存路径。
您也可以点击右侧的小方块修改设置位置的路径。
2.“数据传输”、“数据同步”、“结构同步”或“批处理作业”等的配置文件是保存在文件位置中,可以通过点击工具->选项->文件位置,就可以直观地看到配置文件的保存路径。(当然,还可以根据实际需求在此处修改配置文件的保存路径,修改完后记得点击确定按钮)
3.此外,例如“查询”、“备份”、“模型”、“图表”这类操作的配置文件,也可以通过另外一个方法找到对应的配置文件的保存位置。例如找一个查询的配置文件的保存位置,先双击需要查找的查询所在的数据库(这里是双击sakila数据库)
再点击查询,然后进入到“对象”的选项卡。
右击任一个对象->点击“打开所在的文件夹”,就可以找到这个查询对应的配置文件所在的保存位置了。
查找文件配置路径并不是很复杂,通过以上方法可以快速查找。如果用户希望在新电脑上使用 Navicat,可能会涉及到原来的电脑中的数据库相关工作内容需要被转移到新电脑上的 Navicat,那么,此时就可以通过上面的方法找到所有工作的配置文件,然后将配置文件拷贝出来,并在新电脑上粘贴。
三、mysql卸载后怎么找回原来建的数据库
每个 DBA是不是都有过删库的经历?删库了没有备份怎么办?备份恢复后无法启动服务什么情况?表定义损坏数据无法读取怎么办?
我曾遇到某初创互联网企业,因维护人员不规范的备份恢复操作,导致系统表空间文件被初始化,上万张表无法读取,花了数小时才抢救回来。
当你发现数据无法读取时,也许并非数据丢失了,可能是 DBMS找不到描述数据的信息。
先来了解下几张关键的 InnoDB数据字典表,它们保存了部分表定义信息,在我们恢复表结构时需要用到。
SYS_TABLES描述 InnoDB表信息CREATE TABLE `SYS_TABLES`(`NAME` varchar(255) NOT NULL DEFAULT'',表名`ID` bigint(20) unsigned NOT NULL DEFAULT'0',表id`N_COLS` int(10) DEFAULT NULL,`TYPE` int(10) unsigned DEFAULT NULL,`MIX_ID` bigint(20) unsigned DEFAULT NULL,`MIX_LEN` int(10) unsigned DEFAULT NULL,`CLUSTER_NAME` varchar(255) DEFAULT NULL,`SPACE` int(10) unsigned DEFAULT NULL,表空间idPRIMARY KEY(`NAME`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_INDEXES描述 InnoDB索引信息CREATE TABLE `SYS_INDEXES`( `TABLE_ID` bigint(20) unsigned NOT NULL DEFAULT'0',与sys_tables的id对应 `ID` bigint(20) unsigned NOT NULL DEFAULT'0',索引id `NAME` varchar(120) DEFAULT NULL,索引名称 `N_FIELDS` int(10) unsigned DEFAULT NULL,索引包含字段的个数 `TYPE` int(10) unsigned DEFAULT NULL, `SPACE` int(10) unsigned DEFAULT NULL,存储索引的表空间id `PAGE_NO` int(10) unsigned DEFAULT NULL,索引的root page id PRIMARY KEY(`TABLE_ID`,`ID`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_COLUMNS描述 InnoDB表的字段信息CREATE TABLE `SYS_COLUMNS`( `TABLE_ID` bigint(20) unsigned NOT NULL,与sys_tables的id对应 `POS` int(10) unsigned NOT NULL,字段相对位置 `NAME` varchar(255) DEFAULT NULL,字段名称 `MTYPE` int(10) unsigned DEFAULT NULL,字段编码 `PRTYPE` int(10) unsigned DEFAULT NULL,字段校验类型 `LEN` int(10) unsigned DEFAULT NULL,字段字节长度 `PREC` int(10) unsigned DEFAULT NULL,字段精度 PRIMARY KEY(`TABLE_ID`,`POS`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_FIELDS描述全部索引的字段列CREATE TABLE `SYS_FIELDS`( `INDEX_ID` bigint(20) unsigned NOT NULL, `POS` int(10) unsigned NOT NULL, `COL_NAME` varchar(255) DEFAULT NULL, PRIMARY KEY(`INDEX_ID`,`POS`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;./storage/innobase/include/dict0boot.h文件定义了每个字典表的 index id,对应 id的 page中存储着字典表的数据。
这里我们需要借助 undrop-for-innodb工具恢复数据,它能读取表空间信息得到 page,将数据从 page中提取出来。
# wget yum install-y gcc flex bison# make# make sys_parser
sys_parser [-h] [-u] [-p] [-d] databases/table
stream_parser读取 InnoDB page从 ibdata1或 ibd或分区表
#./stream_parserYou must specify file with-f optionUsage:./stream_parser-f<innodb_datafile> [-T N:M] [-s size] [-t size] [-V|-g] Where:-h- Print this help-V or-g- Print debug information-s size- Amount of memory used for disk cache(allowed examples 1G 10M). Default 100M-T- retrieves only pages with index id= NM(N- high word, M- low word of id)-t size- Size of InnoDB tablespace to scan. Use it only if the parser can't determine it by himself.
c_parser从 innodb page中读取记录保存到文件
#./c_parserError: Usage:./c_parser-4|-5|-6 [-dDV]-f<InnoDB page or dir>-t table.sql [-T N:M] [-b<external pages directory>] Where-f<InnoDB page(s)>-- InnoDB page or directory with pages(all pages should have same index_id)-t<table.sql>-- CREATE statement of a table-o<file>-- Save dump in this file. Otherwise print to stdout-l<file>-- Save SQL statements in this file. Otherwise print to stderr-h-- Print this help-d-- Process only those pages which potentially could have deleted records(default= NO)-D-- Recover deleted rows only(default= NO)-U-- Recover UNdeleted rows only(default= YES)-V-- Verbose mode(lots of debug information)-4-- innodb_datafile is in REDUNDANT format-5-- innodb_datafile is in COMPACT format-6-- innodb_datafile is in MySQL 5.6 format-T-- retrieves only pages with index id= NM(N- high word, M- low word of id)-b<dir>-- Directory where external pages can be found. Usually it is pages-XXX/FIL_PAGE_TYPE_BLOB/-i<file>-- Read external pages at their offsets from<file>.-p prefix-- Use prefix for a directory name in LOAD DATA INFILE command
接下来,我们演示场景的几种数据恢复场景。
是否启用了 innodb_file_per_table其恢复方法有所差异,当发生误删表时,应尽快停止MySQL服务,不要启动。若 innodb_file_per_table=ON,最好只读方式重新挂载文件系统,防止其他进程写入数据覆盖之前块设备的数据。
如果评估记录是否被覆盖,可以表中某些记录的作为关键字看是否能从 ibdata1中筛选出。
也可以使用 bvi(适用于较小文件)或 hexdump-C(适用于较大文件)工具
以表 sakila.actor为例CREATE TABLE `actor`(`actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,`first_name` varchar(45) NOT NULL,`last_name` varchar(45) NOT NULL,`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY(`actor_id`),KEY `idx_actor_last_name`(`last_name`)) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8
首先恢复表结构信息1.解析系统表空间获取 page信息
./stream_parser-f/var/lib/mysql/ibdata1
2.新建一个 schema,把系统字典表的 DDL导入
cat dictionary/SYS_*| mysql recovered
4.解析系统表空间包含的字典表信息,
./c_parser-4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page-t dictionary/SYS_TABLES.sql> dumps/default/SYS_TABLES 2> dumps/default/SYS_TABLES.sql./c_parser-4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000002.page-t dictionary/SYS_COLUMNS.sql> dumps/default/SYS_COLUMNS 2> dumps/default/SYS_COLUMNS.sql./c_parser-4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page-t dictionary/SYS_INDEXES.sql> dumps/default/SYS_INDEXES 2> dumps/default/SYS_INDEXES.sql./c_parser-4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000004.page-t dictionary/SYS_FIELDS.sql> dumps/default/SYS_FIELDS 2> dumps/default/SYS_FIELDS.sql
cat dumps/default/*.sql| mysql recovered
./sys_parser-pmsandbox-d recovered sakila/actor
由于 5.x版本 innodb引擎并非完整记录表结构信息,会丢失 AUTO_INCREMENT属性、二级索引和外键约束, DECIMAL精度等信息。
若是 mysql 5.5版本 frm文件被从系统删除,在原目录下 touch与原表名相同的 frm文件,还能读取表结构信息和数据。若只有 frm文件,想要获得表结构信息,可使用 mysqlfrm--diagnostic/path/to/xxx.frm,连接 mysql会显示字符集信息。
因为是共享表空间模式,数据页都存储在 ibdata1,可以从 ibdata1文件中提取数据。
1.获取表的 table id,sys_table存有表的 table id,sys_table表 index id是1,所以从0000000000000001.page获取表 id./c_parser-4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page-t dictionary/SYS_TABLES.sql| grep sakila/actor000000000B28 2A000001430D4D SYS_TABLES"sakila/actor" 158 4 1 0 0"" 0000000000B28 2A000001430D4D SYS_TABLES"sakila/actor" 158 4 1 0 0"" 0
2.利用 table id获取表的主键 id,sys_indexes存有表索引信息,innodb索引组织表,找到主键 id即找到数据,sys_indexes的 index id是3,所以从0000000000000003.page获取主键 id
./c_parser-4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page-t dictionary/SYS_INDEXES.sql| grep 158000000000B28 2A000001430BCA SYS_INDEXES 158 376"PRIMARY" 1 3 0 4294967295000000000B28 2A000001430C3C SYS_INDEXES 158 377"idx_actor_last_name" 1 0 0 4294967295000000000B28 2A000001430BCA SYS_INDEXES 158 376"PRIMARY" 1 3 0 4294967295000000000B28 2A000001430C3C SYS_INDEXES 158 377"idx_actor_last_name" 1 0 0 4294967295
3.知道了主键 id,就可以从对应 page中提取表数据,并生成 sql文件。
./c_parser-4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000376.page-t sakila/actor.sql> dumps/default/actor 2> dumps/default/actor_load.sql
cat dumps/default/*.sql| mysql sakila