设为首页 加入收藏

TOP

合并不同服务器的数据表(thinkphp5+mysql)(一)
2018-10-23 18:08:45 】 浏览:37
Tags:合并 不同 服务器 数据 thinkphp5 mysql

先说哈自己的整体思路:

先把其它服务器的 数据库表复制映射到本地 合并成一张表 循环合并的数据插入到本地数据库表中并处理自己业务的逻辑

下面图文讲解

首先需要把 mysql的FEDERATED引擎开启,默认是关闭的,可以通过show engines 命令查看;

\

在mysql配置文件加上红色标注的

\

准备工作已ok,下面贴上代码

1.配置信息

\

\

2.把其它服务器数据表映射到本地
 public function syncMemberTable()
    {
        // thinking :不同服务器的数据表 通过fea引擎 把其它服务器的表 映射到本地数据库 在把所有的平台的member数据 合并成 在循环写入更新数据

        $merge_sql = 'create table ' . $this->member_table_merge . ' as   ';

        //链接池
        foreach ($this->dsns as $key => $dsn) {
            $channel_table = $this->member_table . '_' . $key;
            // 创建映射关系
            $show_create_sql = ' show create table ' . $this->member_table;

            $create_table_sql_result = Db::connect($dsn)->query($show_create_sql);
            $create_table_sql = null;
            $create_table_sql = $create_table_sql_result[0]['Create Table'];


            // 把 table 名和engine 修改。并增加 connect  语句
            $fed_channel_table = $channel_table . '_FED';

            //本地是否已经存在

            $fed_channel_table_has_sql = ' show tables like ' . '\'' . $fed_channel_table . '\'';//show tables like 后面表名比需要引号

            $fed_channel_table_has_result = Db::execute($fed_channel_table_has_sql);//有 1 没有 0
            if ($fed_channel_table_has_result == 0) {
                Log::record("原来的sql:" . $create_table_sql, 'INFO');
                $new_create_fed_sql = '';
                $new_create_fed_sql = str_replace($this->member_table, $fed_channel_table, $create_table_sql);
                $new_create_fed_sql = str_replace("InnoDB", 'FEDERATED  ', $new_create_fed_sql);
                $user = $dsn['username'];
                $password = $dsn['password'];
                $host = $dsn['hostname'];
                $database = $dsn['database'];
                $connection = " CONNECTION='mysql://$user:$password@$host:3306/$database/$this->member_table'";
                $new_create_fed_sql = $new_create_fed_sql . $connection;
                Log::record("替换FED的sql:" . $new_create_fed_sql, 'INFO');

                $new_create_result = Db::execute($new_create_fed_sql);//执行映射sql
                if ($new_create_result !== false) {

                    $msg = "$key 渠道的$this->member_table" . '表 映射到本地数据库成功';
                    echo $msg;
                    Log::record($msg, 'INFO');

                } else {
                    $msg = "$key 渠道的$this->member_table" . '表 映射到本地数据库失败';
                    echo $msg;
                    Log::record($msg, 'INFO');
                    exit();//出错不执行
                }


            }

            //映射成功后 在本地在新建一张表 因为映射的表不能操作表
            //先查看是否存在

            $new_create_table_has_sql = ' show tables like ' . '\'' . $channel_table . '\'';
            $result = Db::execute($new_create_table_has_sql);//存在1 不存在0

            if ($result == 0) {

                /*--------------------------------------------------*/
                Log::record('---------------starting create table ------------------', 'debug');
                $new_create_sql = '';
                //$new_create_sql = str_replace($this->member_table, $channel_table, $create_table_sql);
                $new_create_sql = ' create table ' . $channel_table . ' as select * from ' . $fed_channel_table;

                Log::record("create的sql:" . $new_create_sql, 'INFO');

                $result = Db::execute($new_create_sql);//执行建表

                if ($result != false) {
                    $msg = "$key 渠道的$this->member_table" . '表 copy到本地数据库成功';
                    echo $msg;
                    Log::record($msg, 'INFO');

                } else {
                    $msg = "$key 渠道的$this->member_table" . '表 copy到本地数据库失败,Error:' . $result;
                    echo $msg;
                    Log::record($msg, 'INFO');
                    exit();
                }

            }
            //判断字段是否存在
            $fields = Db::getTableInfo($channel_table, 'fields');

            if (!in_array('channel_id', $fields)) {

                //复制成功后新增渠道字段 后面做逻辑处理 渠道字段直接放在id后面
                $channel_id = $d
编程开发网
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇mysql查询操作 下一篇存储过程中使用Exec拼接SQL语句造..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

最新文章

热门文章

C 语言

C++基础

windows编程基础

linux编程基础

C/C++面试题目