데이터베이스 에 있 는 모든 데이터 시트 의 완전 중복 기록 을 원 키 로 되 돌려 줍 니 다.

4367 단어 Shell
하나의 데이터베이스 에 있 는 모든 표 의 모든 필드 데 이 터 를 완전히 한 번, 심지어 몇 번 반복 하여 하나의 라 이브 러 리 의 데이터 가 몇 십 만 개의 기록 에 이 르 렀 다 면 아래 의 스 크 립 트 를 사용 하여 원 키 로 다시 할 수 있 습 니 다!
selectinct 이 명령 은 무 거 운 데 이 터 를 조회 하 는 것 입 니 다. 나중에 추가 하면 *  그렇다면 모든 필드 에서 무 거 운 데 이 터 를 조회 하 는 것 입 니 다.어떤 필드 의 데 이 터 를 다시 검색 하려 면   데이터베이스 에서 distinct 필드 를 선택 하 십시오. 데이터 시트;
그러나 주의해 야 할 조건:
1. 먼저 원본 데이터 베 이 스 를 백업 해 야 합 니 다 (이것 은 필수 입 니 다)
2. 그 다음 에 데이터베이스 에서 몇 개의 (또는 모든 표) 표를 골 라 서 표 안의 기록 이 몇 개 있 는 지 확인 하고 뒤의 검증 에 사용 할 수 있 습 니 다.
데이터베이스 에서 count (1) 를 선택 하 십시오. 데이터 시트;
3. 한 표 또는 몇 개의 표 에 대해 데 이 터 를 만 들 고 업데이트 하여 뒤의 검증 에 사용 할 수 있 습 니 다.
#!/bin/bash

#         
database_name="test"
database_user="root"
database_user_password='123456'

################################################           ################################################

##               
old_table_name=`mysql -u"$database_user" -p"$database_user_password" -e "use "$database_name";show tables" | grep -v Tables_in_`

#                
echo "$old_table_name" > /root/old_table_name.txt

#              
num_old_tab_name=`cat /root/old_table_name.txt | wc -l`
####################################################################################################################


#                  
function create_new_table
{
	echo -e "\033[032m       ,        \033[0m"
	
	for ((notn=1;notn<="$num_old_tab_name";notn++))
	do
		old_tab_name=`sed -n "$notn"p /root/old_table_name.txt`
		new_tab=`mysql -u"$database_user" -p"$database_user_password" -e "use "$database_name";create table New_"$old_tab_name" select distinct * from "$old_tab_name" "`
		echo "$new_tab"    #      
	done	 

}

#          。       ,    ,      .               
function delete_data_tables
{
	echo -e "\033[032m            \033[0m"
	echo -e "\033[031m             ,       ! \033[0m"
	
	for ((notns=1;notns<="$num_old_tab_name";notns++)); do
		old_table_names=`sed -n "$notns"p /root/old_table_name.txt`
		del=`mysql -u"$database_user" -p"$database_user_password" -e "use "$database_name";delete from "$old_table_names" "`
		echo "$del"      #       
	done

}


#       ,                    
function select_old_tabs
{
	echo -e "\033[032m             ,   ,                 \033[0m"
	
	for (( odt = 1; odt <= "$num_old_tab_name"; odt++ )); do
		old_tab_names=`sed -n "$odt"p /root/old_table_name.txt`
		select_old_tabs=`mysql -u"$database_user" -p"$database_user_password" -e "use "$database_name";select * from "$old_tab_names""`
		echo "$select_old_tabs"    #        
	done

}


#               
function insert_data_table
{
	echo -e "\033[032m               \033[0m"

	#                   ,           
	for ((i=1;i<="$num_old_tab_name";i++))
	do
		#      ,           
        	tab_name=`sed -n "$i"p /root/old_table_name.txt`
        	insert_data=`mysql -u"$database_user" -p"$database_user_password" -e "use "$database_name";insert into "$tab_name" select * from New_"$tab_name";"`
        	echo "$insert_data"     #         
	done
}

#       
function del_new_tables
{
	echo -e "\033[032m           \033[0m"
	
	#       
	new_tables_name=`mysql -u"$database_user" -p"$database_user_password" -e "use "$database_name";show tables;" | grep -v Tables_in_"$database_name" | grep  ^New_`
	
	#                 
	echo "$new_tables_name" > /root/new_tab.txt
	
	#             new_num
	new_num=`cat /root/new_tab.txt | wc -l`
	
	#    
	for ((d=1;d<="$new_num";d++))
	do
		new_tab_name=`sed -n "$d"p /root/new_tab.txt`
		dnt=`mysql -u"$database_user" -p"$database_user_password" -e "use "$database_name";drop table "$new_tab_name""`
		echo "$dnt"    #       
	done
}

create_new_table
delete_data_tables
delete_data_tables
select_old_tabs
insert_data_table
del_new_tables

#      
rm -rf /root/new_tab.txt
rm -rf /root/old_table_name.txt

echo -e "\033[035m /root            ,       ! \033[0m"

좋은 웹페이지 즐겨찾기