Più che fare una sincronizzazione 1 volta al giorno, opterei per una schedulazione oraria così da evitare qualsiasi blocco.
Ipotizzando una linearità sulla quantità dei dati: 300000 / 12 (ore 07-19) = 25000 record da processare ogni ora.
Provando ad effettuare un piccolo test questi i risultati:
25000 record
1- Inserimento row2row ~ 793.5376 secondi.
2- Inserimento Batch ~ 14.4125 secondi
Come puoi vedere effettuando queste prove  l'inserimento/aggiornamento sul db conviene farlo solo attraverso batch.
Cerco di spiegare il concetto della soluzione più veloce:
1- Hai 3 tabelle che vengono popolate a seconda della tipologia di record.
2- Recuperi tutto il contenuto dal DB1 e inizi a processare i dati
 A questo punto aggiungerei un bit:
1- Memorizzo il dato già presente sul DB2 nel DB1 (vedi sotto)
2- Aggiungo un marcatore per la tipologia di dato nel DB1 "create/update/no_action" (nulla vieta 0,1,2)
3- Effettuo la query nel DB1 solo sui record non processati "create"
4- Effettuo la query nel DB1 solo sui record da aggiornare "update"
5- Una volta effettuate le operazioni necessarie sul DB2 aggiorno tutti (inteso come quelli passati) i dati del DB1 in "no_action" così da evitare di recuperarli al prossimo cron.
Fatto questo sia l'aggiornamento che l'inserimento risulteranno abbastanza veloci.
Prevedi 2 variabili nel modello di gestione dati:
	
	
	
		PHP:
	
	
		public $data_insert=[];
public $data_update=[];
[QUOTE="macus_adi, post: 205054, member: 35357"]Più che fare una sincronizzazione 1 volta al giorno, opterei per una schedulazione oraria così da evitare qualsiasi blocco.
Ipotizzando una linearità sulla quantità dei dati: 300000 / 12 (ore 07-19) = 25000 record da processare ogni ora.
Provando ad effettuare un piccolo test questi i risultati:
25000 record
1- Inserimento row2row ~ 793.5376 secondi.
2- Inserimento Batch ~ 14.4125 secondi
Come puoi vedere effettuando queste prove  l'inserimento/aggiornamento sul db conviene farlo solo attraverso batch.
Cerco di spiegare il concetto della soluzione più veloce:
1- Hai 3 tabelle che vengono popolate a seconda della tipologia di record.
2- Recuperi tutto il contenuto dal DB1 e inizi a processare i dati
 A questo punto aggiungerei un bit:
1- Memorizzo il dato già presente sul DB2 nel DB1 (vedi sotto)
2- Aggiungo un marcatore per la tipologia di dato nel DB1 "create/update/no_action" (nulla vieta 0,1,2)
3- Effettuo la query nel DB1 solo sui record non processati "create"
4- Effettuo la query nel DB1 solo sui record da aggiornare "update"
5- Una volta effettuate le operazioni necessarie sul DB2 aggiorno tutti (inteso come quelli passati) i dati del DB1 in "no_action" così da evitare di recuperarli al prossimo cron.
Fatto questo sia l'aggiornamento che l'inserimento risulteranno abbastanza veloci.
Prevedi 2 variabili nel modello di gestione dati:
[PHP]
public $data_insert=[];
public $data_update=[];
	 
 Effettua tutta la porzione di codice che serve alla fine dividi l'array in pacchetti da 200/250 e inserisci/aggiorni in batch.
Credo sia abbastanza chiaro il concetto.!
Qui il codice (CI) per la verifica dei tempi, crea una tabella con id,text1,text2,text3,text4 e aggiungi nell'autoload l'helper string.
	
	
	
		PHP:
	
	
		private $num_rows=25000;
private $model=['text1','text2','text3','text4'];
private $data=[];
public function __construct() {
   parent::__construct();
   $this->crea_dati_inserimento();
}
public function crea_dati_inserimento(){
   for($i=0;$i<$this->num_rows;$i++){
      foreach ($this->model as $items){
         $this->data[$i][$items]=random_string('alnum',rand(5,20));
      }
   }
}
public function carica_dati_one_row(){
   set_time_limit(0);
   $this->benchmark->mark('code_start');
   foreach ($this->data as $k=>$v){
      $this->db->insert('table1',$v);
   }
  
   /**
    * Inserimento batch
    */
   /*
   $a=array_chunk($this->data,250);
   foreach ($a as $items){
      $this->db->insert_batch('table1',$items);
   }*/
  
  
   $this->benchmark->mark('code_end');
   echo $this->benchmark->elapsed_time('code_start', 'code_end');
}