在开发和维护一个数据库驱动的应用程序时,数据库的结构会随代码的改变而改变。 因为一个数据库结构发生改变的时候源代码也经常会需要做出改变,Yii 提供了一个 数据库迁移 功能,该功能可以记录数据库的变化, 以便使数据库和源代码一起受版本控制。 创建一个数据库迁移: yii migrate/create <name> 这是一个通用的创建数据迁移格式,其中<name>是必填的参数,用来描述当前迁移。 而mssql数据库中并没有text数据类型,但是有个类似的数据类型,叫做ntext。如果在数据库迁移到mysql的时候直接写实体字段类型text,那么如果改换数据库为mssql的时候就会很麻烦。 数据库中会出现一个叫做migration的表,用来记录迁移记录,如图: ? 选中的就是当前迁移操作生成的记录。 会生成一个数据表test_table并且插入一条数据。 ?
在开发的过程中,需要修改数据库的模型,而且需要在修改之后更新数据库,最直接就是删除旧表,但是会丢失数据。所有最好的方式就是数据库迁移。 它可以追踪数据库模型的变化,然后把变动应用到数据库中。 在flask中可以使用Flask-Migrate扩展,来实现数据迁移。 会创建migrations文件夹,所有的迁移文件都放在里面。 python manage.py db init 创建自动迁移脚本: upgrade():函数把迁移中的改动应用到数据库中。 自动创建的迁移脚本会 根据模型定义和数据库当前状态的差异,生成upgrade()和downgrade()函数的内容。 对比不一定完全正确,有可能会遗漏一些细节,需要进行检查。 python manage.py db upgrade 更新完之后,在数据库会出现一个表 versions每迁移一次里面都会生成一个文件。
设计目标 设计一个数据迁移的方案,需要实现以下目标 迁移速度 qps 需要达到1k,这样能保证1亿的数据能够在1~2天内跑完 迁移qps可控 迁移有可能对线上服务有影响,需要可动态调整qps 数据完整, 因为有迁移速度的要求,我们将每个步骤进行分解,确保每个部分可以异步化,并发处理。这样可以提升速度。 遍历数据 完整遍历老的数据库。 不同的数据库有不同的方法,比如对于mysql,可以利用现成的binlog,其中就有全量的数据。 对于其他数据库,通常有两种方案 1. 可以可以将成功遍历完, 写入到任务队列的数据记录到某个存储,比如redis中,这样可以保证游标中断,或者服务重启后,可以从这个key中继续遍历,这样就实现了迁移的可中断 2. 场景三: 数据量比较大,公司无基础设施 遍历老数据库, 写入到消息队列中,然后监听消息,查询数据,写入到新库中。也很容易实现。
前言: 在我们开发某些项目后,难免会遇到更换服务器,重新部署数据库的时候,那么问题来了? 究竟怎么如何操作才能达到最佳效果; 起源: (1):起初仅仅是为了测试用,所以迁移的时候不必把数据库中的数据全部迁移过去,仅仅需要数据库的架构即可; (2):某些时候需要更换服务器,那么此时已经在内部存储了大量数据了 ,此时只能把架构+数据全部迁移过来; 解说: 以本地“Login”数据库为例,帮助大家理解四种迁移方式; 一:“分离”—>“附加” 说明: (1)或许会遇到分离数据库后,无法在其它服务器附加数据库的问题 (权限不够,自行更改属性) (2)推荐把数据库放到默认的数据库文件存放目录(E:\Microsoft SQL Server\实例根目录\MSSQL12.SQLEXPRESS\MSSQL\DATA); ( ,防止误操作,类似于保存不同版本信息; ---- 四:生成“SQL脚本” 说明:兼容性最好,轻松避免数据库迁移的其它问题 ----
Ss Sep25 2:17 /usr/sbin/keepalived -D root 73610 0.0 0.0 112500 2908 ? S Sep25 2:21 \_ /usr/sbin/keepalived -D root 73611 0.0 0.0 112484 2064 ? ]$ Note: 优先级相对原master要低,否则会抢ip 两个keepalived 上 advert_int 要设为 1 为了尽快完成切换 ---- 切换时间选择在业务低点 一般选择业务低点进行数据库操作
在之前的文章中,我们介绍了基于 CBBACK 以及 CBRESTORE 等操作方式进行的分布式数据库 Couchbase 集群迁移方案,具体可参考链接:分布式数据库Couchbase 集群迁移 其实,在基于不同的业务场景以及架构方案,针对分布式数据库 Couchbase 集群迁移有多种不同的实现策略,只有能够达到高效、稳定及安全,才是最优选择。 在进行主题之前先补充一下分布式数据库 Couchbase 一些基本概念:在 Couchbase 的集群架构中,没有中心节点和 Router 的概念,这些工作是由 Smartclient 完成的,在客户端与 基本思路: 1、备份老的 Couchbase 服务数据 2、将新 Couchbase 服务器加入到老服务器集群中,并通过 Rebalance 同步两台服务器 Cache 数据 3、修改客户端 Couchbase 配置节点 4、Failover 老服务器进行升级 本文主要基于 CBTRANSFER 操作方案以实现 Couchbase 集群迁移。
切换时间选择在业务低点 一般选择业务低点进行数据库操作,目的是为了降低业务风险,和数据丢失的风险 通过监控历史数据可以确定这个时间窗口 ---- 关闭原集群mha 由于集群软件在侦测到主服务器失效后会干预相关资源 [mysql@slave02 bin]$ masterha_check_status --conf=/etc/app1.cnf app1 is stopped(2:NOT_RUNNING). [mysql@slave02 bin]$ ps faux | grep manager mysql 27192 0.0 0.0 103244 864 pts/2 S+ 00:23 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2:
所以我决定把web服务器和数据库部署到一起。 二、迁移前导步骤 迁移过程中顺便记录一手,供后面再次迁移到别的服务器上查阅,省的麻烦。 服务器是CentOS 7.4 1.再次安装MariaDB yum -y install mariadb mariadb-server 2.启动MariaDB systemctl start mariadb create database novel 三、迁移数据库表和结构 先cd到mysql的运行路径下,再执行一下命令: 1.导出数据和表结构: mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql mysqldump -uroot -p dbname > dbname .sql 敲回车后会提示输入密码 2.只导出表结构 mysqldump -u用户名 -p密码 -d 数据库名 (2)设置数据库编码 mysql>set names utf8; (3)导入数据(注意sql文件的路径) mysql>source /home/xxxx/dbname .sql; 方法二:
一、迁移整个库 1.mongodump(导出) 命令格式:mongodump -h host:port -d dbname -o D:datadump 2.mongorestore(导入) 命令格式: dbnameNew -u username -p pwd --authenticationDatabase admin --dir D:datadumpdbname mongorestore出现的问题: L2Calc.calcgsdataflash dbnameNew -u username -p pwd --authenticationDatabase admin --noIndexRestore --dir D:datadumpdbname 二、迁移单个
批评,这是正常的血液循环,没有它就不免有停滞和生病的现象——奥斯特洛夫斯基 数据库迁移可以使用flyway git地址:https://github.com/flyway/flyway 官网地址:
中间件,我给它的定义就是为了实现某系业务功能依赖的软件,包括如下部分: Web服务器 代理服务器 ZooKeeper Kafka(本章节) 在我以前的工作中遇到过多次数据库迁移,如果数据库是一样的,其实相对都是比较简单的 因为基本上都可用利用数据库自身的同步原理就可以实现,但是现实中还有需求就是异构数据库的迁移。就好比Oracle到MYSQL,当然这里我为了简单,我这里用了简单的MYSQL迁移到PG。 消费者从Kafka里面消费数据,然后写入PG数据库。 环境准备 一个MYSQL数据库,里面有一个库,一个表,表里面有部分数据。 一个PG数据库,里面已经提前创建了和MYSQL同样的库表(无数据)。 import json import time import psycopg2 from kafka import KafkaConsumer from datetime import datetime value_deserializer=lambda v: json.loads(v.decode('utf-8')) ) self.pg_conn = psycopg2.
-i ova centos-dev-test01-v2v.ova -o local -os /vmhost/dev/dev-test01 -of qcow2 [ 0.0] Opening the centos-dev-test01-v2v.xml <? 已开始 1.1.5 测试可用性 登陆迁移后的虚拟机测试 [root@clsn7 ~]# ssh root@192.168.19.123 The authenticity of host '192.168.19.123 [root@clsn7 ~]# virsh autostart centos-dev-test01-v2v 域 centos-dev-test01-v2v标记为自动开始 至此一台机器的迁移完成, 后续按照相同的方式将其他的虚拟机进行迁移即可。
-i ova centos-dev-test01-v2v.ova -o local -os /vmhost/dev/dev-test01 -of qcow2 [ 0.0] Opening the centos-dev-test01-v2v.xml <? 已开始 1.1.5 测试可用性 登陆迁移后的虚拟机测试 [root@clsn7 ~]# ssh root@192.168.19.123 The authenticity of host '192.168.19.123 [root@clsn7 ~]# virsh autostart centos-dev-test01-v2v 域 centos-dev-test01-v2v标记为自动开始 至此一台机器的迁移完成, 后续按照相同的方式将其他的虚拟机进行迁移即可。
本文将系统讲解数据库迁移的核心概念、常见场景、迁移策略、风险控制与最佳实践,帮助你在不同环境或版本之间安全、稳定地完成数据库迁移。一、什么是数据库迁移? 数据库迁移(DatabaseMigration)指将数据库中的数据、结构、配置从一个环境迁移到另一个环境,或从一个版本迁移到另一个版本。 2.版本升级迁移MySQL5.7→MySQL8.0PostgreSQL12→PostgreSQL16MongoDB4.2→MongoDB7.0特点:兼容性问题多、需要验证SQL行为变化。 (是否允许停机)2.选择迁移方式常见迁移方式如下:迁移方式是否停机适用场景特点全量备份+恢复需要小规模数据、低峰迁移简单但耗时全量+增量同步可不停机大规模数据、生产迁移常用于MySQL、MongoDB主从切换 1.数据丢失风险来源:迁移中断增量同步失败误操作规避策略:多份备份(本地+云)校验数据一致性(checksum)迁移前锁表或使用binlog/redolog2.业务中断风险来源:切换失败新库性能不足规避策略
在实际项目开发中,一般不会创建模型,然后迁移到数据库,因为同一个数据库,可能对应着多个项目,所以此时我们需要懂得如何反向迁移。 Django django的orm模型已经内置了反向迁移命令 python manage.py inspectdb > models.py # >后面是生成的文件路径和名称 flask flask并没有配置相关的反向迁移模块 我在网上试了多个具体相关功能的迁移包,最后我个人感觉sqlacodegen相对来说还是比较好用的,可通过下方命令安装 pip install sqlacodegen 在命令行执行 sqlacodegen mysql://用户名:密码@ip:端口号/数据库 >models.py 大体跟django的类似,但是多了数据库连接 使用这个包,额外要注意一点,他会报一个错误( mysqldb查找不到的错误)。
一日风雨交加,晚上值班时,一业务的数据库空间不够, 报警 。 正常停库 SQL> shutdown immediate Database closed. Database dismounted. -03113: end-of-file on communication channel Process ID: 381 Session ID: 191 Serial number: 3 可能由于昨晚数据库强制关闭 ,导致文件状态可能不一致,因为正常关闭数据库会同步校验各文件,使得重新启动的时候文件时间点一致。 Partitioning, OLAP, Data Mining and Real Application Testing options SQL> select status from v$instance 2 2 52428800 1 CURRENT 3 0 52428800 1 UNUSED 4
---Mysql系统库是MyISAM的,相较而言,PG数据库在这方面要好一些。 是pgsql的模板数据库。 所谓模板数据库就是创建新database时,PostgreSQL会基于模板数据库制作一份副本,其中会包含所有的数据库设置和数据文件。 怎么创建模板数据库? alter database tmpdb is_template false; drop database tmpdb; 数据迁移案例 数据备份 pg_dump -h 192.168.30.1 -p
table1 table2 > db1-table1-table2.sql #库名 表名 2.多库备份 mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql 3.备份所有库 mysqldump -uroot -p123 --all-databases > all.sql 二.备份恢复 1.退出数据库后 mysql -u -p < filename.sql; 2.在数据库内 创建空数据库 选择数据库 然后使用source filename; 来进行还原 例如 use db1; source /root/ db1.sql 三.数据库迁移 务必保证在相同版本之间迁移 # mysqldump -h 源IP -uroot -p123 --databases db1 | mysql -h 目标IP -uroot -t : 只备份数据库中的数据 –single-transaction 适合innodb数据库的备份。 2.
这可能包括更改数据库的物理位置(如从本地数据库迁移到云数据库),更改数据库管理系统(DBMS),或者更改数据库的架构和结构。 2. 缺点:风险较高,如果迁移过程中出现问题,可能会导致系统长时间不可用。 2. 缺点:对于大数据量的迁移,可能需要较长时间,且需要处理导出/导入过程中的数据一致性问题。 2. 数据库复制: 描述:使用数据库复制技术,将源数据库的数据实时或定期复制到目标数据库。 2. 数据一致性校验 字段值校验:比较源数据库和目标数据库中每个表的字段值,确保字段值一致。 方法:可以使用SQL查询逐行比较字段值,或者使用哈希值进行校验。 例如: SELECT MD5(column1 || column2 || column3) FROM source_table; SELECT MD5(column1 || column2 ||
本教程为整个数据库表进行创建迁移,弥补以前未做的工作,且仅适合于Migrations(2.0.8)版本用户及以上。 大家都知道Migrations是一个在开发和维护数据库驱动的应用过程中,数据库的结构与源代码的开发同步更新。 因为数据库结构改变后需要源代码随之而改变,Yii支持此类数据库迁移特征,这样你就可以用数据库迁移的形式追踪数据库的变化,也就是与源代码同步的版本控制。 我们先找到一个核心文件:/vendor/yiisoft/yii2/console/controllers/BaseMigrateController.php 创建迁移的视图文件:/vendor/yiisoft ,然后我们打开命令执行:yii migrate,这个时候有多少个迁移文件会告诉你,还会问你是否执行,我们输入y 确定执行,这个时候就开始往数据库导入表了,如有报错可发截图并询问我或者百度。