db2迁移到mysql方案

2023-05-16

导读

对应db2迁移到mysql方案在网上都是使用navcat,这个种方案在生产环境不现实,因为生产环境基本上时命令行方式,所以优先想到的是使用命令行到处txt文件,然后导入到mysql,使用kettle等etl工具进行导入,最后想到手写一个java服务迁移。

使用命令行方式导入

db2的导出方式

先连接db2数据库

db2 connect to 数据库名

导出命令 chardel"表示双引号为字段定界符 coldel,表示逗号为列定界符 codepage=1208表示导出编码为utf-8

db2 "export to 'xxx/xxx.txt' of del modified by chardel\" coldel, codepage=1208 select * from schema.表名"

但是使用上面的命令发现大字段会进行截取,最长只能32700,同时也通过命令db2 get db cfg和db2set -all查看了数据库编码确认为utf-8,所以对应大字段导出增加一个关键字lobsinfile

db2 "export to 'xxx/xxx.txt' of del modified by chardel\" coldel, codepage=1208 lobsinfile select * from schema.表名"

但是导出发现会生成一个lob文件专门存储大字段,无法导入到mysql了,所以采用shell脚本拼接大字段,要将schema替换成对应的,也可以修改成传参方式

#!/bin/bash
#创建导出目录
madir ~/back
echo "导出目录为:${HOME}/back"
#连接数据库
if ( db2 connect to '数据库名' >/dev/null )
then
	echo "数据库连接成功"
else
	echo "数据库连接失败"
fi
#公共变量
maxLength=0 #字段最大字符数
colStr="" #表的列拼接字符串
#获得当前列最大字符长度 参数为:表名 列名
function getMaxLength(){
	sql="select max(length($2)) from ${1}"
	maxLength=`db2 -x ${sql}`
	#去除空格
	maxLength=`eval echo "${maxLength}"`
}
#获得表的列拼接的sql查询字符串 参数:表名
function getColumnStr(){
	#获取表的所以列和类型
	querySql="select colname,typename from syscat.columns where tabschema = 'schema' and tabname = '${1}' order by colno"
	datas=(`db2 -x ${sql}`)
	
	colStr=""
	#遍历类型 数组存储方式是下标为偶数是列名,下标为奇数是类型,所以从1开始每次步长为2
	for((i=1;i<${#datas[@]};i+=2))
	do
		# 如果不是大字段直接拼接
		if [[ "#{datas[i]}" != "CLOB" && "#{datas[i]}" != "BLOB"  ]];then
			colStr="${colStr},${datas[i-1]}"
			continue
		fi
		#获得此表的此列的最大字符长度
		getMaxLength "schema.${1}" "${datas[i-1]}"

		column="CLOB(${datas[i-1]})"
		#如果结果为-,说明值为null
		if [ "${maxLength}" == '-' ];then
			colStr="${colStr},${column}"
			continue
		fi
		#计算拆分循环次数
		num=`expr ${maxLength} / 32600`
		if(( `expr ${maxLength} % 32600` != 0 ));then
			num=`expr ${num} + 1`
		fi
		#开头不加标记
		colStr="${colStr},rtrim(left(substr(${column},${startNum}),32600))"
		#开始拼接,第二个拆分加@标记
		for((j=1;j<${num};j++))
		do
			startNum=`expr ${i} \* 32600`
			temp="${temp},'@'||rtrim(left(substr(${column},${startNum}),32600))"
		done
		colStr="${colStr},${temp}"
	done
	colStr=${colStr:1}
}
function execSql(){
	#获得表的查询sql
	getColumnStr "${1}"
	#导出为#字段定界符、$列定界符、编码utf-8
	exportSql="export to '${HOME}/back/${1}.txt' of del modified by chardel# coldel$ codepage=1208 ${colStr}"
	db2 "${exportSql}">/dev/null
	if(( $? == 4 ));then
		echo "${1}:导出失败"
	fi
	#替换特殊标记,将大字段连接一起
	sed -i 's/\#\$\#\@//g' "${HOME}/back/${1}.txt"
	sed -i 's/\$\$/\$NULL\$/g' "${HOME}/back/${1}.txt"
	sed -i 's/\$\$/\$NULL\$/g' "${HOME}/back/${1}.txt"
	sed -i 's/\$$/\$NULL/g' "${HOME}/back/${1}.txt"
}
echo "开始导出数据..."
execSql "表名"
}

mysql导入方式

mysql -u用户名 -p密码 --local-infile
mysql> use 数据库;
mysql> set global local_infile=1;
mysql> set foreign_key_checks=0;
mysql> load data local infile '导出文件' into table 表名 character set utf8mb4 fields terminated by '$' enclosed by '#' escaped by '#' lines terminated by '\n';

在进行导入的时候有部分表会报unknow error 1300,猜测有可能是字符集问题,使用gbk导入虽然不会报错,但导入的数据有问题,猜测有可能是数据包含特殊字符导致导入有差异最终放弃此方式迁移

使用ETL工具迁移

虽然在生产上不能用,但为了了解在本地上试了一下,会有各种问题所以选择放弃,我也只成功一次后面就莫名失败。

使用java代码方式

这个就比较简单了直接拼接sql语句插进去就行了
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>db-transfer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>db-transfer</name>
    <description>db-transfer</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>com.ibm.db2</groupId>
            <artifactId>jcc</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.yml

spring:
  datasource:
    mysql:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://192.168.137.137:3306/rule?serverTimezone=GMT
      username: root
      password: 123456
    db2:
      driver-class-name: com.ibm.db2.jcc.DB2Driver
      url: jdbc:db2://192.168.137.137:50000/testdb:currentSchema=RULE;serverTimezone=GMT;
      username: test
      password: 123456
      

启动类DbTransferApplication.java

package com.example.dbtransfer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.SingleConnectionDataSource;

import javax.sql.DataSource;

@SpringBootApplication
public class DbTransferApplication {

    public static void main(String[] args) {
        SpringApplication.run(DbTransferApplication.class, args);
    }

    @Bean(name = "mysql")
    @Primary
    @ConfigurationProperties("spring.datasource.mysql")
    public DataSource mysql(){
        return new SingleConnectionDataSource();
    }
    @Bean(name = "db2")
    @ConfigurationProperties("spring.datasource.db2")
    public DataSource db2(){
        return new SingleConnectionDataSource();
    }

    @Bean(name = "mysqlJdbc")
    @Primary
    public JdbcTemplate mysqlJdbc(){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(mysql());
        return jdbcTemplate;
    }
    @Bean(name = "db2Jdbc")
    public JdbcTemplate db2Jdbc(){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(db2());
        return jdbcTemplate;
    }

}

数据库迁移类TransferDB.java

package com.example.dbtransfer.db;

import com.example.dbtransfer.page.Page;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

/**
 * 数据库迁移类
 */
public class TransferDB {
    // 日志打印
    private Logger log = LoggerFactory.getLogger(this.getClass());
    // 源数据库
    private DBBuildAbstract from;
    // 目标数据库
    private DBBuildAbstract to;
    // 类型转换函数,可以自定义类型转换
    private Function<Object, Object> format;

    public DBBuildAbstract getFrom() {
        return from;
    }

    public void setFrom(DBBuildAbstract from) {
        this.from = from;
    }

    public DBBuildAbstract getTo() {
        return to;
    }

    public void setTo(DBBuildAbstract to) {
        this.to = to;
    }

    public Function<Object, Object> getFormat() {
        return format;
    }

    public void setFormat(Function<Object, Object> format) {
        this.format = format;
    }

    public TransferDB(DBBuildAbstract from, DBBuildAbstract to) {
        this.from = from;
        this.to = to;
        // 默认直接返回,不转换
        this.format = o -> o;
    }

    /**
     * 根据指定条数进行迁移,避免一下读取撑爆内存
     * 此方法是values(),(),()方式,目标库为mysql时性能高
     *
     * @param num 分页条数
     */
    public void transBach(int num) {
        // 获取源的所有表名
        List<String> tables = from.getTables();
        // 遍历表名
        tables.parallelStream().forEach(table -> {
            try {
                // 设置目标数据库外键失效
                to.keyDisable(true);
                //获取记录数
                int count = from.getCount(table);
                // 封装page进行分页查询
                Page page = new Page(num, count);
                for (int i = 0; i < page.getTotalPage(); i++) {
                    //设置当前页
                    page.setCurrentPage(i);
                    // 获取源数据库数据
                    List<Map<String, Object>> data = from.getDataPage(table, page);
                    // 目标数据库获取insert语句
                    String insertBachSql = to.getInsertBachSql(table, data.get(0).keySet(), data.size());
                    // 组成参数集合
                    List<Object> args = new ArrayList<>();
                    data.forEach(row -> {
                        row.forEach((k, v) -> {
                            args.add(format.apply(v));
                        });
                    });
                    // 目标数据库执行sql语句
                    to.getJdbcTemplate().update(insertBachSql, args.toArray());
                }
                // 设置目标数据库外键生效
                to.keyDisable(false);
            } catch (DataAccessException e) {
                log.info("{}:导入失败", table);
                throw new RuntimeException(e);
            }
            log.info("{}:导入成功", table);
        });
    }

    /**
     * 此方法为预编译values()方式,目标库为db2性能高
     */
    public void trans() {
        // 获取源的所有表名
        List<String> tables = from.getTables();
        // 遍历表名
        tables.parallelStream().forEach(table -> {
            try {
                // 设置目标数据库外键失效
                to.keyDisable(true);
                // 获取源数据库数据
                List<Map<String, Object>> data = from.getData(table);
                // 目标数据库获取insert语句
                String insertSql = to.getInsertSql(table, data.get(0).keySet());
                // 组成参数集合
                List<Object[]> allArgs = new ArrayList<>();
                data.forEach(row -> {
                    List<Object> args = new ArrayList<>();
                    row.forEach((k, v) -> {
                        args.add(format.apply(v));
                    });
                    allArgs.add(args.toArray());
                });
                // 目标数据库执行sql语句
                to.getJdbcTemplate().batchUpdate(insertSql, allArgs);
                // 设置目标数据库外键生效
                to.keyDisable(false);
            } catch (DataAccessException e) {
                log.info("{}:导入失败", table);
                throw new RuntimeException(e);
            }
            log.info("{}:导入成功", table);
        });
    }
}

数据库sql构建抽象类DBBuildAbstract.java

package com.example.dbtransfer.db;

import com.example.dbtransfer.page.Page;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

public abstract class DBBuildAbstract {
    // 表名或者字段名定界符
    protected String enclosed;
    // 数据库schema
    protected String schema;
    // jdbc连接执行sql
    protected JdbcTemplate jdbcTemplate;

    public DBBuildAbstract(String enclosed, String schema, JdbcTemplate jdbcTemplate) {
        this.enclosed = enclosed;
        this.schema = schema;
        this.jdbcTemplate = jdbcTemplate;
    }

    public String getEnclosed() {
        return enclosed;
    }

    public void setEnclosed(String enclosed) {
        this.enclosed = enclosed;
    }

    public String getSchema() {
        return schema;
    }

    public void setSchema(String schema) {
        this.schema = schema;
    }

    public JdbcTemplate getJdbcTemplate() {
        return jdbcTemplate;
    }

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    /**
     * 获取所有表名
     *
     * @return 表名集合
     */
    public abstract List<String> getTables();

    /**
     * 设置外键是否失效
     *
     * @param b true失效,false生效
     */
    public abstract void keyDisable(boolean b);

    /**
     * 根据表名查数据量
     *
     * @param table 表名
     */
    public int getCount(String table) {
        Integer count = jdbcTemplate.queryForObject("select count(1) from " + enclosed + table + enclosed, int.class);
        count = Objects.isNull(count) ? 0 : count;
        return count;
    }

    ;

    /**
     * 根据表名查数据
     *
     * @param table	表名
     */
    public List<Map<String, Object>> getData(String table) {
        return jdbcTemplate.queryForList("select * from " + enclosed + table + enclosed);
    }

    /**
     * 根据表名分页查数据
     *
     * @param table 表名
     */
    public List<Map<String, Object>> getDataPage(String table, Page page) {
        String sql = "select * from " + enclosed + table + enclosed + " limit "
                + (page.getCurrentPage() * page.getPageSize()) + "," + page.getPageSize();
        return jdbcTemplate.queryForList(sql);
    }

    /**
     * 获取插入sql
     *
     * @param table      表名
     * @param columnList 列
     * @return
     */
    public String getInsertSql(String table, Set<String> columnList) {
        StringBuilder columns = new StringBuilder();
        StringBuilder value = new StringBuilder();
        for (String key : columnList) {
            columns.append(",").append(enclosed).append(key).append(enclosed);
            value.append(",").append("?");
        }
        columns.delete(0, 1);
        value.delete(0, 1).insert(0, "(").append(")");
        return "insert into " + enclosed + table + enclosed + " (" +
                columns + ") values " + value;
    }

    /**
     * 获取批量插入sql
     *
     * @param table      表名
     * @param columnList 列
     * @param rowNum     数据量
     * @return
     */
    public String getInsertBachSql(String table, Set<String> columnList, int rowNum) {
        StringBuilder columns = new StringBuilder();
        StringBuilder value = new StringBuilder();
        StringBuilder values = new StringBuilder();
        for (String key : columnList) {
            columns.append(",").append(enclosed).append(key).append(enclosed);
            value.append(",").append("?");
        }
        columns.delete(0, 1);
        value.delete(0, 1).insert(0, "(").append(")");
        for (int i = 0; i < rowNum; i++) {
            values.append(",").append(value);
        }
        return "insert into " + enclosed + table + enclosed + " (" +
                columns + ") values " + values.delete(0, 1);
    }

}

mysql的sql语句构建类MysqlSqlBuild.java

package com.example.dbtransfer.db;

import org.springframework.jdbc.core.JdbcTemplate;

import java.sql.SQLException;
import java.util.List;
import java.util.Objects;

public class MysqlSqlBuild extends DBBuildAbstract {
    public MysqlSqlBuild(String schema, JdbcTemplate jdbcTemplate) {
        super("`",schema,jdbcTemplate);
        try {
            if (!(Objects.requireNonNull(jdbcTemplate.getDataSource()).getConnection()
                    .getMetaData().getDatabaseProductName().toLowerCase().contains("mysql"))) {
                throw new RuntimeException("数据库不对应");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public List<String> getTables() {
        String sql = "select TABLE_NAME from information_schema.tables where" +
                " TABLE_SCHEMA = '"+schema+"' order by TABLE_NAME";
        return jdbcTemplate.queryForList(sql, String.class);
    }

    @Override
    public void keyDisable(boolean b) {
        int key = b ? 0 : 1;
        jdbcTemplate.execute("SET FOREIGN_KEY_CHECKS = " + key);
    }
}

db2sql语句构建类DB2SqlBuild.java

package com.example.dbtransfer.db;

import org.springframework.jdbc.core.JdbcTemplate;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class DB2SqlBuild extends DBBuildAbstract {
    public DB2SqlBuild(String schema, JdbcTemplate jdbcTemplate) {
        super("\"",schema,jdbcTemplate);
        try {
            if (!(Objects.requireNonNull(jdbcTemplate.getDataSource()).getConnection()
                    .getMetaData().getDatabaseProductName().toLowerCase().contains("db2"))) {
                throw new RuntimeException("数据库不对应");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public List<String> getTables() {
        String sql = "select TABNAME from syscat.TABLES where TABSCHEMA = '" +
                schema + "' order by TABSCHEMA";
        return jdbcTemplate.queryForList(sql, String.class);
    }

    @Override
    public void keyDisable(boolean b) {
        String disableStr = b ? "NOT" : "";
        String sql = "select CONSTNAME,TABNAME from syscat" +
                ".references where TABSCHEMA = '" + schema + "';";
        List<Map<String, Object>> forKeyList = jdbcTemplate.queryForList(sql);
        if (forKeyList.size() == 0) return;
        forKeyList.forEach(key -> {
            String sql1 = "ALTER TABLE \"" + key.get("TABNAME") + "\" ALTER FOREIGN KEY \"" +
                    key.get("CONSTNAME") + "\" " + disableStr + " ENFORCED";
            jdbcTemplate.execute(sql1);
        });

    }
}

测试

package com.example.dbtransfer;

import com.example.dbtransfer.db.DB2SqlBuild;
import com.example.dbtransfer.db.MysqlSqlBuild;
import com.example.dbtransfer.db.TransferDB;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;

@SpringBootTest
class DbTransferApplicationTests {
    private Logger log = LoggerFactory.getLogger(this.getClass());
    @Autowired
    @Qualifier("mysqlJdbc")
    private JdbcTemplate mysql;
    @Autowired
    @Qualifier("db2Jdbc")
    private JdbcTemplate db2;

    /**
     * db2到mysql迁移
     */
    @Test
    void testTrans(){
        DB2SqlBuild db2SqlBuild = new DB2SqlBuild("RULE", db2);
        MysqlSqlBuild mysqlSqlBuild = new MysqlSqlBuild("rule", mysql);
        TransferDB transferDB = new TransferDB(db2SqlBuild, mysqlSqlBuild);
        long l = System.currentTimeMillis();
        //transferDB.trans();//15647
        //transferDB.transBach(10000);//2064
        log.info("用时:{}", System.currentTimeMillis() - l);
    }
	/**
     * mysql到db2迁移
     * 因为mysql日期查询出来是LocalDateTime,需要自定义转换
     */
    @Test
    void testTrans2(){
        DB2SqlBuild db2SqlBuild = new DB2SqlBuild("RULE", db2);
        MysqlSqlBuild mysqlSqlBuild = new MysqlSqlBuild("rule", mysql);
        TransferDB transferDB2 = new TransferDB(mysqlSqlBuild, db2SqlBuild);
        // 自定义数据转换
        transferDB2.setFormat(o->{
            if (o instanceof LocalDateTime) {
                return Timestamp.valueOf((LocalDateTime) o);
            } else if (o instanceof LocalDate) {
                return Timestamp.valueOf(LocalDateTime.of((LocalDate) o, LocalTime.MIN));
            } else if (o instanceof LocalTime) {
                return Timestamp.valueOf(LocalDateTime.of(LocalDate.now(), (LocalTime) o));
            }
            return o;
        });
        long l = System.currentTimeMillis();
        transferDB2.trans();//1136
        transferDB2.transBach(1000);//3892
        log.info("用时:{}", System.currentTimeMillis() - l);
    }
}

Page.java

package com.example.dbtransfer.page;

public class Page {
    private Integer currentPage;
    private Integer pageSize;
    private Integer totalPage;

    public Page(Integer pageSize, Integer totalCount) {
        this.pageSize = pageSize;
        totalPage = totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
    }

    public Integer getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(Integer currentPage) {
        this.currentPage = currentPage;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(Integer totalPage) {
        this.totalPage = totalPage;
    }
}

经过测试,发现java性能比命令行差了不少,但在对比数据完整性时没有问题,所有最终选择java方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

db2迁移到mysql方案 的相关文章

  • PHP mysql_num_rows 死错误

    我想创建一个页面 用户可以在其中添加他们的信息 我已经创建了该页面 但我真正的问题是代码 我有一些问题 这部分代码
  • MySQL:查询中周数的周日期范围

    我有一个看起来像这样的数据库表 id clock info 1 1262556754 some info 2 1262556230 some other info 3 1262556988 and another 4 1262555678
  • mysql中的按位移位

    如何在 MySQL 中进行按位移位 有没有具体的指令或者操作符 如果不是 如何最佳地模拟它 看一下按位运算符MySQL first http dev mysql com doc refman 5 0 en bit functions htm
  • MySQL - 查询合并具有相同 id 的行并保留该 id 的所有条目但作为一条记录

    我一直在处理本地保存在 wamp 服务器上的 mysql 数据库中的表 我正在使用 wamp 中的 phpmyadmin 区域来运行查询 我正在尝试获取数据来执行以下操作 谁能帮我制作一张包含许多植物记录的表格 植物可以有多个名称 表格将其
  • 为什么涉及用户变量的表达式的求值顺序未定义?

    From MySQL手册 http dev mysql com doc refman 5 7 en user variables html以下查询的输出不保证始终相同 SET a 0 SELECT a AS first a a 1 AS s
  • 从 Yii2 中的联结表检索数据

    我试图从 Yii2 中的连接表获取数据无需额外查询 我有 2 个模型 用户 组 通过连接表 user group 关联 在 user group 表中 我想存储此关系的额外数据 管理标志 将数据添加到连接表的最佳方法是什么 link 方法接
  • MySQL 获取时间优化

    o我有一个包含 200 万个寄存器的表 但它很快就会增长得更多 基本上 该表包含具有相应描述符的图像的兴趣点 当我尝试执行选择在空间上靠近查询点的点的查询时 总执行时间花费太长 更准确地说 持续时间 获取 0 484 秒 27 441 秒
  • 使用 cfchart 标签在单个饼图中显示多个查询的数据

    请考虑以下代码 现在我的代码中有以下代码 cfm页面内的 tag DataSource xx xx x xx Name of the database sgemail Name of the relevant column event vc
  • grails/mysql 时区更改

    完成更改应用程序时区的最佳方法是什么 在我看来 必须发生以下情况 服务器 TZ 已被系统管理员更改 mysql必须重新启动 数据库中每个基于时间的列都必须使用convert tz 或等效方法更新所有值 因此 要么必须编写一个 mysql 脚
  • mysql 在 sum() 函数上使用 concat,例如 concat(sum(col1),"%")

    我正在尝试合并多个查询 但其中一个查询使用 sum 当我尝试在此列上应用 concat 时 我得到不需要的 blob 结果 我如何在聚合列上应用 concat 和 union 我期待这个结果 SELECT row 1 col1 UNION
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • 每个搜索词显示一行,如果未找到则替换默认值

    Query SELECT product id name FROM product WHERE barcode in 681027 8901030349379 679046 679047 679082 679228 679230 67923
  • Mysql获取特定表的最后一个id

    我必须从特定的插入表中获取最后的插入 ID 可以说我有这个代码 INSERT INTO blahblah test1 test 2 VALUES test1 test2 INSERT INTO blahblah2 test1 test 2
  • #1115 - 未知字符集:'utf8mb4'

    我的电脑上运行着一个本地网络服务器 用于本地开发 我现在正处于导出数据库并导入到我的托管 VPS 的阶段 导出然后导入时出现以下错误 1115 未知字符集 utf8mb4 有人能指出我正确的方向吗 该错误明确表明您没有utf8mb4您的阶段
  • WHERE 条件基于 PK 的查询是否建议使用“LIMIT 1”?

    我正在查询 mySQL 数据库以检索 1 个特定行的数据 我使用表主键作为 WHERE 约束参数 E g SELECT name FROM users WHERE userid 4 userid 列是表的主键 在 mySQL 语句末尾使用
  • MySQL 帮助:如何查找客户的所有订单,直到价格 <= 20 且状态='未付款'

    我认为通过提供以下示例可以更好地理解我的问题 我有一个包含以下数据的表 orderid Price username paymentstatus 1 10 john unpaid 2 10 john unpaid 4 10 john unp
  • db2中如何删除所有非数字字母

    我在 DATA 列 varchar 中有一些数据 如下所示 Nowshak 7 485 m Maja e Korabit Golem Korab 2 764 m Tahat 3 003 m Morro de Moco 2 620 m Cer
  • 如何在php中根据url从mysql获取数据?

    我在 mysql 数据库中有一个页表 其中包含 page name title content author 字段 我想用 php 来获取它http www domain com index php page page name http
  • Laravel Schema Builder 改变存储引擎

    我正在尝试更改表并将其存储引擎更改为InnoDb 当我跑步时php artisan migrate它完成且没有错误 然而 当我检查 Sequel Pro 中的存储引擎时 没有任何变化 public function up Schema ta
  • MySQL 复制是双向的

    我们已经成功设置了 MySQL 文献中描述的主从复制 不过 我很好奇是否有人设置了双向复制 例如 如果安装了 Drupal 或 Wordpress 第一个 主 数据库服务器出现故障 第二个 从属 数据库服务器恢复正常 与此同时 用户不断进行

随机推荐

  • 傅里叶变换与EEG傅里叶变换处理

    傅里叶变换与EEG傅里叶变换处理 EEG与傅里叶变换 The Basics of Signal Processing Fourier transforms Nyquist frequency sampling theorem and ali
  • 【详解】计算机视觉算法导读篇

    目录 1 深度学习发展史2 计算机视觉概述2 1 定义2 2 任务分解2 3 应用场景2 4 计算机视觉发展史 1 深度学习发展史 起源 xff1a 深度学习所需要的神经网络技术起源于20世纪50年代 xff0c 叫做感知机 当时也通常使用
  • Linux ManJaro 换源、安装应用

    1 换源 sudo pacman mirrors i c China m rank pacman文件配置 sudo nano etc pacman conf 在末尾插入 xff08 可以先浏览器打开源看是否可用 xff09 archlinu
  • 树莓派(RPi) CentOS7安装配置PHP7

    在树莓派配置了Nginx之后 xff0c 自然要上PHP大法 在下萌新 xff0c 学习PHP的时候直接入手的PHP7 xff0c 所以我就在树莓派上也配置了PHP7 xff0c 现在我将安装过程写下来分享一下 0 环境说明 设备 xff1
  • 树莓派使用apt-get安装配置Nginx+PHP7+MySQL(MariaDB)附带部分细节

    最近使用树莓派搞定了一个小项目 xff0c 现在树莓派闲置了 xff0c 正好拿来做一个小型Web服务器进行功能测试 没想到配置的过程比我想象的复杂 xff0c 好多小细节是用云服务器的时候没遇见过的 我已经尝试写的很简洁了 xff0c 各
  • UnknownError:Fail to find the dnn implementation解决方法

    程序加上下面代码 gpus 61 tf config experimental list physical devices 39 GPU 39 if not gpus return 34 No GPU available 34 try Cu
  • 设置pandas打印所有列

    pd set option display max columns None
  • 使用tensorflow时报错Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR

    使用tf2 1时 xff0c cuda和cudnn都安装好了 xff0c 报错 Could not create cudnn handle CUDNN STATUS INTERNAL ERROR 最开始以为是cudnn版本问题 xff0c
  • linux安装mongo数据库软件robo3T(转载)

    robo 3T xff08 robomongo xff09 在ubuntu16 04上安装记录 96 王南北丶 2017 10 08 22 19 字数 450 阅读 1622评论 2喜欢 3 robo 3T是mongodb的一个非常好用的可
  • spss入门基本用法

    一 xff0e 数据 1 个案排序 xff1a 对数据视图中的某个个案进行排序 xff0c 具体排序规则可以点进去选择 2 变量排序 xff1a 对变量视图中某个变量进行排序 xff0c 具体规则可以点进去选择 3 转置 xff1a 行列互
  • 点积的概念

    在数学中 xff0c 数量积 xff08 dot product scalar product xff0c 也称为点积 xff09 是接受在实数R上的两个向量并返回一个实数值标量的二元运算 它是欧几里得空间的标准内积 两个向量a 61 a1
  • 如何在jupyter notebook直接安装模块

    pip install 模块名 注意要加 xff01
  • networkx 不能显示中文的解决办法

    修改pythonx lib site packages matplotlib mpl data matplotlibrc 用记事本打开 找到font family sans serif xff0c 将前面的 去掉 找到font sans s
  • sift = cv2.xfeatures2d.SIFT_create()运行报错解决方案

    可以把原opencv卸载 xff08 pip uninstall opencv xff0c 然后安装扩展版本的opencv xff0c pip install opencv contrib python 61 61 3 4 2 16 xff
  • early EOF index-pack failed的解决办法

    git chone时报错如下 xff1a fatal The remote end hung up unexpectedly fatal early EOF fatal index pack failed 网上找了各种办法后 xff0c 又
  • CentOS7.9通过rpm离线安装mysql8.0

    mysql5 6安装参考 xff1a https blog csdn net lgxzzz article details 124409836 mysql5 7安装参考 xff1a https blog csdn net weixin 44
  • excel复制后卡死的解决办法

    excel复制表格中的内容后 xff0c 整个excel表格会卡死 xff0c 下面给出两个解决办法 第一步点击 文件 选项 加载项 转到 xff0c 取消方框内所有选项 xff0c 第二步点击 文件 选项 公式 xff0c 在工作簿计算中
  • nodebb接入已有的账号体系及实现单点登陆、更改nodebb样式及页面

    一 前言 首先 xff0c 当接到这个实现nodebb单点登陆这个功能需求时 xff0c 自己还不太了解单点登陆的概念或者说过程原理 所以就只能一步一步入手 xff0c 从接入自己的账号体系 xff0c 覆盖已有的登陆体系开始 二 接入自己
  • Linux系统安装go环境的方法

    在Linux系统中安装go环境 下面介绍两种方法 一 基于Debian的发行版本 xff0c 使用apt get安装go环境 1 安装命令 xff1a sudo apt get install golang 2 设置环境变量 有三个变量GO
  • db2迁移到mysql方案

    导读 对应db2迁移到mysql方案在网上都是使用navcat xff0c 这个种方案在生产环境不现实 xff0c 因为生产环境基本上时命令行方式 xff0c 所以优先想到的是使用命令行到处txt文件 xff0c 然后导入到mysql xf